问题描述
遇到问题了。为什么两种 opt 情况下都是空白? (通过使用 readLine() 没问题。)
谢谢!
String srcFile = "d:/javatest/File2String.txt";
BufferedReader br = new BufferedReader(new FileReader(srcFile));
char[] chs = new char[1024];
int len = 0;
//opt 1 while ((len = br.read(chs,len)) != -1){ // Why are blanks with no endings???
//opt 2 while ((len = br.read(chs)) != -1){ // Why are blanks with length of len???
System.out.println(chs);
}
解决方法
无论有多少字符读入 chs,行 System.out.println(chs);
总是打印 1024 个字符。在 opt2 中,您读取 len
个字符,并打印 1024 个字符,因此当 len \0 用于小文件,或者将重复上一次迭代读取的值当文件大小 > 1024 时的最后一个循环。
在 opt1 中,len 最初为零,因此您在无限循环中调用 br.read(chs,0)
。您要求读取 0 并返回 0 - len 永远不会从 0
更改,因为每次读取都返回 0 并分配回 len
。每次打印 chs
的 1024 个值 - 都设置为 \0
。
您可以通过将 i= 0 循环到 len 并打印 System.out.print(chs[i])
,或者在一个步骤中使用 System.out.println(new String(chs,len))
每次打印确切的 chs 缓冲区内容,但请注意,这是再次复制/复制内容。
如果您只是想将文件 cat/type 到当前控制台,您可以在没有 BufferedReader 的情况下使用:
try(var os = new FileInputStream(srcFile)) {
os.transferTo(System.out);
}