BufferedReader readLine用于while循环

时间:2015-05-04 05:48:24

标签: while-loop bufferedreader readline

我见过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()方法有什么不了解?

4 个答案:

答案 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读取一行文本。一行被认为是由换行符之一或返回终止。   请记住,当文件中的第一行不为空时会执行。即使有一个点,它也会读取它。    希望它现在有所帮助。 :) 以下评论了解更多细节。 祝你有愉快的一天。