【问题标题】:BufferReader unexpected outputBufferReader 意外输出
【发布时间】:2019-05-16 10:33:32
【问题描述】:

我有这个简单的方法:

private String read(String filePath) throws IOException {
    FileReader fileReader = new FileReader(filePath);
    BufferedReader bufferedReader = new BufferedReader(fileReader);
    String fileContent = "";
    StringBuilder stringBuilder = new StringBuilder(fileContent);

    while (bufferedReader.readLine() != null){
        System.out.println(bufferedReader.readLine());
        stringBuilder.append(bufferedReader.readLine());
    }
    return fileContent;
}

正如您在第 8 行中看到的,我包含了 print 用于调试目的 我希望这个方法从这个 txt 文件中返回字符串:

1a1
2b 2a
3c 3b 3a
4d 4cr 4bb4 4a
5e 5d 5c 5b 5ax
6f 6ea 6d 6ca 6bb 6a
7g 7f 7ea

由于某种原因,输出是这样的:

2b 2a
5e 5d 5c 5b 5ax
null

为什么它只读取第二行和第五行? 这个 null 来自哪里? 最后返回的字符串似乎是空的。

我想了解这里发生了什么。谢谢 :)

【问题讨论】:

  • 每次调用 readLine() 都会读取一个新行。您在循环的每次迭代中读取 3 行。
  • 最终你应该在方法退出/返回时关闭 FileReader。

标签: java file bufferedreader


【解决方案1】:

这是因为您在 while 循环的 null 检查中每隔三行使用一次,从 2 开始每隔 3 行打印一次,从 3 开始每隔 3 行附加一次,如下所示:

1  null check
2  print
3  append
4  null check
5  print
6  append
7  null check
8  print
9  append
... and so on

您应该将读取的行保存在String 变量中,并在循环中使用它,如下所示:

String line;
while ((line = bufferedReader.readLine()) != null){
    System.out.println(line);
    stringBuilder.append(line);
}

现在循环头结合了一个赋值和一个null检查,从readLine赋值的变量代表从文件中读取的最后一行。

【讨论】:

    【解决方案2】:

    每个readLine() 正在读取一个全新的行,为了分析发生了什么,让我们为每个readLine() 调用命名。

    while (bufferedReader.readLine() != null) {          // Read 1
        System.out.println(bufferedReader.readLine());   // Read 2
        stringBuilder.append(bufferedReader.readLine()); // Read 3
    }
    

    现在让我们将每个 readLine() 与其读取的行关联起来:

    1a1                   // Read 1 while loop condition
    2b 2a                 // Read 2 this is when we print it
    3c 3b 3a              // Read 3 append to stringBuilder
    4d 4cr 4bb4 4a        // Read 1 while loop condition
    5e 5d 5c 5b 5ax       // Read 2 this is when we print it
    6f 6ea 6d 6ca 6bb 6a  // Read 3 append to stringBuilder
    7g 7f 7ea             // Read 1 while loop condition
                          // Read 2 this is when we print it (null)
                          // Read 3 append to stringBuilder
    

    如您所见,您消耗了很多行,而您只打印了几行。其他人已经指出了解决此问题的好方法,因此不在此答案中。

    【讨论】:

      【解决方案3】:

      好吧,问题来了:你每次调用bufferedReader.readLine(),这个其实每次都读一个新行,所以第一行读入while并丢弃,第二行是System.out.println-ed,第三个写入文件,依此类推。您需要存储第一行读取并以此工作,例如:

      for (String line = bufferedReader.readline(); line != null; line = bufferedReader.readLine()) {
          System.out.println(line);
          stringBuilder.append(bufferedReader.readLine());
      }
      

      【讨论】:

        【解决方案4】:
        1a1                   // Read 1 while (bufferedReader.readLine() != null) 
        next 2a               // Read 2 System.out.println(bufferedReader.readLine()); --print
        3c 3b 3a              // Read 3 stringBuilder.append(bufferedReader.readLine());-next
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-02-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-02-19
          • 2021-09-12
          • 2021-10-13
          • 2020-02-21
          相关资源
          最近更新 更多