JAVA使用字节流读取数据一定注意精确读取

版权声明:不短不长八字刚好@wzy https://blog.csdn.net/qq_38089964/article/details/84642722

使用InputStream读取文件数据,采用read(byte[])这个方法的时候,一般是如下方式:

byte[] bytes = new byte[1024];
File file = new File("G:\\NIO\\src\\cn\\wzy\\test.txt");
InputStream inputStream = new FileInputStream(file);
while (inputStream.read(bytes) != -1) {
	System.out.print(new String(bytes, "utf-8"));
}
inputStream.close();

定义一个字节数组为1024,每次就读满1024为止。这样在最后的一组中常常不会正好读满1024个字节,比如最后一组中只有500个字节的数据,那么后来的524个字节就是无效数据。

例子:test.txt数据为hello world;那么后来的数组其实是没有赋值的,也就是初始值0;

显然后面的字节是无效的,也就是无效数据,如图中多了很多空格(0为空字符对应的asch码)。

所以正确精确读取方式:

byte[] bytes = new byte[1024];
int len;
File file = new File("G:\\NIO\\src\\cn\\wzy\\test.txt");
InputStream inputStream = new FileInputStream(file);
while ((len = inputStream.read(bytes)) != -1) {
	byte[] effective = new byte[len];
	System.arraycopy(bytes, 0, effective, 0, len);
	System.out.print(new String(effective, "utf-8"));
	System.out.println("\n==========================");
	for (byte b: effective) {
		System.out.print(b + " ");
	}
}
inputStream.close();

精确结果:

 

猜你喜欢

转载自blog.csdn.net/qq_38089964/article/details/84642722