while 循环中使用的 BufferedReader readLine

BufferedReader readLine used in while loop

我看到 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 循环意味着 "if the first line (line[0]) is not null, do something (presumably an infinite number of times)",并且永远不会超过文档的第一行。我对 BufferedReader 或 .readLine() 方法有什么不了解?

以下 while 循环的大括号内的行:

while ( (line = br.readLine()) != null )

(line = br.readLine()) != null

并且方法 readLine() 将继续从文件中读取下一行,一旦到达文件末尾,它 returns null。所以它是这样工作的。

附带说明一下,while 循环的计数器没有限制,它只需要一个计算结果为 true 或 false 的布尔表达式。

检查代码

while ( (line = br.readLine()) != null ) {
  // do something
} 

首先将 line 分配给任何 br.readLine() returns,然后将 line 与 null 进行比较。括号强制执行该操作顺序。

随着程序循环遍历文件中的所有行,变量line 将继续取下一行文本的值,直到到达文件末尾。此时 line 被赋值 null,然后终止循环。

what I don't understand is how the while loop is internally incrementing its counter

此循环没有计数器。循环终止条件是line == null(另一种说法是一直循环whileline != null)。当 line 为空时循环结束。

To me, the while loop above means "if the first line (line[0]) is not null

不,行不是数组。它是一个字符串,表示文件的一行,并且随着从文件中读取每一行而更新该值。

.NET 中有一个 different method

string[] allLines = File.ReadAllLines(path);

这种不同的方法是一次将文件的所有行读入内存。该方法对于读取小文件很方便,而您提供的方法内存效率更高。它文件的内容,只为当前行分配内存。这种方法对于大文件来说要好得多。

请注意,缓冲 reader 在循环语义中没有任何作用。 它只是一种更有效地从磁盘读取文件的机制(或 perhaps unnecessary overhead).

首先,有必要了解一下Filereader和Buffered的区别Reader。 Buffered Reader 从字符输入流中读取文本,缓冲字符以便有效地读取字符、数组和行。 而 FileReader 读取一行 text.A 行被认为由一个换行符或 return 终止。 请记住,当文件中的第一行不是 empty.Even 时,While 将执行,如果那里有一个点,它会读取它。 希望它现在有所帮助。 :) 在下面评论以获取更多详细信息。 祝你有个愉快的一天。

希望我能正确回答您的问题。您想知道 BufferedReader 如何在没有计数变量的情况下确定在循环中的何处继续读取?

如果您查看 BufferedReader.class 内部,您会看到一个 private int pos; 计数器,每次从流中读取一个字符时该计数器都会递增,例如在 public int read()readLine() 中也发生了同样的情况,不同之处在于 pos 递增直到到达行尾。

您可以使用reset()功能重置内部计数器(这是到最后一个标记位置,详见here)。