我见过BufferedReader使用while循环迭代文件的内容,代码或多或少像:
try {
FileReader fr = new FileReader(file);
Buffered Reader br = new BufferedReader(fr);
String line;
while ( (line = br.readLine()) != null ) {
// do something
}
} catch () {}
我不明白的是,while循环在内部递增计数器直到它读取了文档中的所有行。对我来说,上面的while循环意味着"如果第一行(line [0])不为null,做一些事情(大概是无限次)",并且永远不会越过第一行文献。我对BufferedReader或.readLine()方法有什么不了解?
答案 0 :(得分:2)
我希望我的问题是正确的。您想知道BufferedReader如何确定在没有计数变量的情况下在循环中继续读取的位置?
如果你看一下BufferedReader.class
,你会看到一个private int pos;
计数器,每当从流中读取一个字符时,该计数器就会递增,例如在public int read()
。同样发生在readLine()
中,区别在于pos
递增,直到到达行尾。
您可以使用reset()
功能重置内部计数器(这是最后一个标记位置,有关详细信息,请参阅here。)
答案 1 :(得分:0)
以下while循环的大括号内的行:
while ( (line = br.readLine()) != null )
是
(line = br.readLine()) != null
方法readLine()
将继续读取文件中的下一行,一旦到达文件末尾,它将返回null
。所以它就是这样的。
另一方面,对while循环没有限制,只有它需要的是一个布尔表达式,其计算结果为true或false。
答案 2 :(得分:0)
检查代码
while ( (line = br.readLine()) != null ) {
// do something
}
首先将line
分配给br.readLine()返回的任何内容,然后将line
与null进行比较。括号强制执行该操作顺序。
当程序循环遍历文件中的所有行时,变量line
将继续接受下一行文本的值,直到它到达文件末尾。此时line
被赋值为null,然后终止循环。
我不明白的是while循环如何在内部递增其计数器
此循环没有计数器。循环终止条件是line == null
(另一种说法是它在 line != null
时保持循环)。当line
为空时,循环结束。
对我来说,上面的while循环意味着"如果第一行(line [0])不为null
不,行不是数组。它是一个表示文件单行的字符串,当从文件中读取每一行时,该值会更新。
在.NET中有一个different method
string[] allLines = File.ReadAllLines(path);
这种不同的方法一次将文件的所有行读入内存。这种方法对于读取小文件很方便,而你提出的方法更有效。它流文件的内容,只为当前行分配内存。对于大型文件,这种方法要好得多。
请注意,缓冲读取器在循环语义中不起作用。它只是一种从磁盘(或perhaps unnecessary overhead)更有效地读取文件的机制。
答案 3 :(得分:0)
首先,有必要了解Filereader和Buffered Reader之间的区别。 缓冲读取器从字符输入流中读取文本,缓冲字符,以便有效地读取字符,数组和行。 而FileReader读取一行文本。一行被认为是由换行符之一或返回终止。 请记住,当文件中的第一行不为空时会执行。即使有一个点,它也会读取它。 希望它现在有所帮助。 :) 以下评论了解更多细节。 祝你有愉快的一天。