版权声明:不短不长八字刚好@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();
精确结果: