【问题标题】:BufferedReader readLine used in while loopBufferedReader readLine 在 while 循环中使用
【发布时间】:2015-07-13 10:30:37
【问题描述】:

我见过 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]) 不为空,则执行某些操作(可能是无限次)”,并且永远不会超过文档的第一行。我对 BufferedReader 或 .readLine() 方法有什么不了解的地方?

【问题讨论】:

    标签: while-loop bufferedreader readline


    【解决方案1】:

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

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

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

    【讨论】:

    • 是的,这就是我想问的。我看不到循环计数以前进到输入文件的下一行的任何方式。我查看了 Oracle 网站上的 BufferReader.class 页面,但在任何地方都找不到 private int pos;。能给我发个链接让我看看它在哪里吗? (以满足我个人的好奇心)。谢谢。
    • 您可以在 developer.classpath.org/doc/java/io/BufferedReader-source.html 上查看 BufferedReader 的源代码(参见第 74 行的 pos 计数器)。或者:如果您使用的是 Eclipse,只需在编辑器中选择 BufferedReader 并按 F3 :)
    【解决方案2】:

    检查代码

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

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

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

    我不明白 while 循环如何在内部增加其计数器

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

    对我来说,上面的 while 循环意味着“如果第一行 (line[0]) 不为空

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

    在 .NET 中有一个 different method

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

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

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

    【讨论】:

      【解决方案3】:

      首先,有必要了解Filereader和Buffered Reader的区别。 Buffered Reader 从字符输入流中读取文本,对字符进行缓冲,以提供字符、数组和行的高效读取。 而 FileReader 读取一行文本。一行被认为是由换行符或返回之一终止。 请记住,当文件中的第一行不为空时,While 将执行。即使那里有一个点,它也会读取它。 希望它现在有帮助。 :) 在下面评论以获取更多详细信息。 祝你有美好的一天。

      【讨论】:

        【解决方案4】:

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

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

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-05-04
          • 1970-01-01
          • 1970-01-01
          • 2016-09-10
          • 2013-12-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多