BufferReader意外输出

mic*_*l w 4 java file bufferedreader

我有这个简单的方法:

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;
}
Run Code Online (Sandbox Code Playgroud)

正如你在第8行中看到的那样,我包含了用于debuging目的的print,我希望这个方法从这个txt文件中返回String:

1a1
2b 2a
3c 3b 3a
4d 4cr 4bb4 4a
5e 5d 5c 5b 5ax
6f 6ea 6d 6ca 6bb 6a
7g 7f 7ea
Run Code Online (Sandbox Code Playgroud)

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

2b 2a
5e 5d 5c 5b 5ax
null
Run Code Online (Sandbox Code Playgroud)

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

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

das*_*ght 7

这是因为你在while循环null检查中使用每三行,打印从第二行开始计算的每三行,并追加从三开始计算每三行,如下所示:

1  null check
2  print
3  append
4  null check
5  print
6  append
7  null check
8  print
9  append
... and so on
Run Code Online (Sandbox Code Playgroud)

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

String line;
while ((line = bufferedReader.readLine()) != null){
    System.out.println(line);
    stringBuilder.append(line);
}
Run Code Online (Sandbox Code Playgroud)

现在,循环标题组合了赋值和null检查,分配的变量readLine表示从文件读取的最后一行.