如何用空白解析 BufferedReader()?
How to resolve BufferedReader() with blanks?
遇到问题。为什么两个 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, 0, 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 < 1024 时输出中会有额外的字符 - 这些是 [=13=]
用于小文件,或者将重复上一次迭代读取的值当文件大小 > 1024 时的最终循环。
在 opt1 中,len 最初为零,因此您在无限循环中调用 br.read(chs, 0, 0)
。您要求读取 0 并返回 0 - len 永远不会从 0
改变,因为每次读取 returns 0 并分配回 len
。每次打印 chs
的 1024 个值 - 全部设置为 [=13=]
.
您可以每次通过循环 i= 0 到 len 并打印 System.out.print(chs[i])
来打印确切的 chs 缓冲区内容,或者使用 System.out.println(new String(chs, 0, len))
一步打印,但请注意,这是复制/复制内容再次.
如果您只是想 cat/type 文件到当前控制台,您可以在没有 BufferedReader 的情况下使用:
try(var os = new FileInputStream(srcFile)) {
os.transferTo(System.out);
}
遇到问题。为什么两个 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, 0, 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 < 1024 时输出中会有额外的字符 - 这些是 [=13=]
用于小文件,或者将重复上一次迭代读取的值当文件大小 > 1024 时的最终循环。
在 opt1 中,len 最初为零,因此您在无限循环中调用 br.read(chs, 0, 0)
。您要求读取 0 并返回 0 - len 永远不会从 0
改变,因为每次读取 returns 0 并分配回 len
。每次打印 chs
的 1024 个值 - 全部设置为 [=13=]
.
您可以每次通过循环 i= 0 到 len 并打印 System.out.print(chs[i])
来打印确切的 chs 缓冲区内容,或者使用 System.out.println(new String(chs, 0, len))
一步打印,但请注意,这是复制/复制内容再次.
如果您只是想 cat/type 文件到当前控制台,您可以在没有 BufferedReader 的情况下使用:
try(var os = new FileInputStream(srcFile)) {
os.transferTo(System.out);
}