Java 字节、字符、二进制等关系

二进制

  • 二进制数据是用0和1两个数码来表示的数:它的基数为2,进位规则是”逢二进一”,借位规则是”借一当二”。
  • 当前的计算机系统使用的基本上是二进制系统,数据在计算机中主要是以补码的形式存储的。
  • bit Byte KB MB关系:

    • bit: 计算机中的二进制位(bit)是长度单位,是一个非常微小的开关,用”开”来表示1,”关”来表示0。 因为计算机通信和存储的时候都是以010101这样的二进制数据为基础的,这儿的一个0和1占的地方就叫bit(位),即一个二进制位。
    • Byte:
      字(Byte)节也是长度单位。 Byte是一个字节保存的,有8个bit位,即8个0或1,8位的第一个位是符号位。

      
      00000001[二进制]=1[十进制] 
      10000000[二进制]=-1[十进制]
      二进制区间[127~-128]:
      正: 01111111[二进制]=127 [十进制] 
      正: 11111111[二进制]=-128 [十进制] 
      负数最大为1111 1111,也就是数字-128
      
      
  • 单位关系

单位 关系
1Byte 8bit
1KB 1024B
1MB 1024KB
1GB 1024MB

八进制

  • Octal,缩写OCT或O,一种以8为基数的计数法,采用0,1,2,3,4,5,6,7八个数字,逢八进1。 一些编程语言中常常以数字0开始表明该数字是八进制,八进制的数和二进制数可以按位对应(八进制一位对应二进制三位),因此常应用在计算机语言中。

十六进制

  • 十六进制(英文名称:Hexadecimal),是计算机中数据的一种表示方法。同我们日常生活中的表示法不一样。它由0-9,A-F组成,字母不区分大小写,与10进制的对应关系是:0-9对应0-9;A-F对应10-15;N进制的数可以用0~(N-1)的数表示,超过9的用字母A-F。
  • 代码中使用:
  • 以0b开始的数据表示二进制
  • 以0开始的数据表示八进制
  • 以0x开始的数据表示十六进制
  • 打印二进制:Integer.toBinaryString(int i)
  • 打印八进制:Integer.toOctalString(int i)
  • 打印十六进制:Integer.toHexString(int i)

Java中基本类型长度

数据类型 占用字节
char 2个Byte(2*8bit)
short 2个Byte(2*8bit)
int 4个Byte(4*8bit)
long 8个Byte(8*8bit)
float 4个Byte(4*8bit)
double 8个Byte(8*8bit)

字节流和字符流

  • 这两者的介绍在我另一篇文章中有写过:《Java Stream相关》
  • 程序中所有的数据都是以流的方式进行传输或保存的,流中保存的实际上是字节文件,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成。
  • 在字节流中输出数据主要是使用OutputStream完成,输入使的是InputStream,在字符流中输出主要是使用Writer类完成,输入流主要使用Reader类完成(这四个都是抽象类)。
  • 字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,而字符流就可以字节流是最基本的,所有的InputStrem和OutputStream的子类都是,主要用在处理二进制数据,它是按字节来处理的。
  • 实际中很多的数据是文本,又提出了字符流的概念,它是按虚拟机的encode来处理,也就是要进行字符集的转化 这两个之间通过 InputStreamReader,OutputStreamWriter来关联,实际上是通过byte[]和String来关联 在实际开发中出现的汉字问题实际上都是在字符流和字节流之间转化不统一而造成的 。
  • 字节流在操作的时候本身是不会用到缓冲区(内存)的,是与文件本身直接操作的,而字符流在操作的时候是使用到缓冲区的。
  • 字节流在操作文件时,即使不关闭资源(close方法),文件也能输出,但是如果字符流不使用close方法的话,则不会输出任何内容,说明字符流用的是缓冲区,并且可以使用flush方法强制进行刷新缓冲区,这时才能在不close的情况下输出内容。
  • 在所有的硬盘上保存文件或进行传输的时候都是以字节的方法进行的,包括图片也是按字节完成,而字符是只有在内存中才会形成的,所以使用字节的操作是最多的。
  • 如果要java程序实现一个拷贝功能,应该选用字节流进行操作(可能拷贝的是图片),并且采用边读边写的方式(节省内存)。

Tags: #Java , #Byte , #bit , #binary