InputStream.read([byte[]) 参数详解

转载请注意出处:http://blog.csdn.net/fengye454545/article/details/79572165      

以前用到I/O操作基本就是仿照网上的Demo代码,写的时候也是很匆忙,根本也是不了解其中的意思,所以今天也是回过头重新看了看。看到InputStream.read(byte[])时也是对参数有点不解,上网查了半天也是没有具体答案,可能太简单了吧偷笑

不过来到这里的小伙伴们肯定也是对这个参数很是疑惑,别着急,待我细细叨来。

一、字节(byte) 与字符的差别   

首先来讲一下这两个概念的区别。

字节:是由8个二进制数组成,也就是8个0或一组成。

字符:字符的大小由实际的编码规则有关,比如在GBK中一个汉字由2个字节组成,而在utf-8中一个汉字由3个或者4个字节组成。

具体详解,推荐博客:http://blog.csdn.net/u010276761/article/details/52692962

二、InputStream.read(byte[])参数详解

byte数组作为一个缓冲区,每次存入和缓冲区一样大小(byte.length)的数据。当然实际存入的数据是一个个十进制的整数。整个流程是这样子的,文件 -> 输入字节流(二进制整数) -> 十进制整数(通过read(byte[])实现)

那么byte[]中缓冲区大小取多少合适呢,这个要取决于你的文件数据内容大小了。什么都别说上代码。 

2.1  这是文件内容,为了方便测试,内容不必取太多。


2.2 测试代码

public static void main(String[] args) throws IOException{
		InputStream in;
		File file = new File("E://text.txt");
		byte[] b = new byte[4];
		in = new FileInputStream(file);
		int len = 0;
		while((len = in.read(b)) != -1){
			String str = new String(b);
			System.out.println(str);
			System.out.println(len);
		}
	}

2.3 执行结果

可以看出,(len = in.read(b) != -1)解释:输入字节流in按照byte数组缓冲区每4个字节循环一次进行read操作,直到读到-1这个整数(-1是一个标识,就是文件数据的末尾)。

注意:可以看到在“呀!?”后面多出一个问号,但是实际文件里并没有问号,这是因为String数据类型强制转化的问题,byte数组大小为4,这意味着每4个字节一读,“我爱”和“中国”都各占4个字节(采用GBK编码),而“呀!”仅仅占了3个字节,(中文的感叹号占了2个字节而英文的仅占1个字节,这里我们采用英文感叹号(采用GBK编码)),在byte数组里就多出一个字节的位置,但是String类哪有那么智能,就把最后一个位置转化成问号(有时候可能是正方形)

正确方式:在While循环语句内加入通过ByteArrayOutputStream这一字节缓冲区,他会将所有字节结合在一起,依次往下添加数据。

public static void main(String[] args) throws IOException{
		InputStream in;
		ByteArrayOutputStream outStream = new ByteArrayOutputStream();
		File file = new File("E://text.txt");
		byte[] b = new byte[4];
		in = new FileInputStream(file);
		int len = 0;
		String str = null;
		while((len = in.read(b)) != -1){
			outStream.write(b,0,len);
			byte[] data = outStream.toByteArray();
			str = new String(data, "GBK");
			System.out.println(len);
		}
		System.out.println(str);
	}


输出结果:

菜鸟一只,如有不对之处请指出。您的鼓励是我写作的最大动力!





猜你喜欢

转载自blog.csdn.net/fengye454545/article/details/79572165