BufferReader意外输出

时间:2018-12-15 11:16:32

标签: java file bufferedreader

我有这个简单的方法:

<div id="carousel">
                <div class="hideLeft">
                    <img src="https://image.tmdb.org/t/p/w300<?php echo $pic1; ?>">
                </div>
                <div class="prevLeftSecond">
                    <img src="https://image.tmdb.org/t/p/w300<?php echo $pic2; ?>">
                </div>
                <div class="prev">
                    <img src="https://image.tmdb.org/t/p/w300<?php echo $pic3; ?>">
                </div>
                <div class="selected">
                    <img src="https://image.tmdb.org/t/p/w300<?php echo $pic4; ?>">
                </div>
                <div class="next">
                    <img src="https://image.tmdb.org/t/p/w300<?php echo $pic5; ?>">
                </div>
                <div class="nextRightSecond">
                    <img src="https://image.tmdb.org/t/p/w300<?php echo $pic6; ?>">
                </div>
                <div class="hideRight">
                    <img src="https://image.tmdb.org/t/p/w300<?php echo $pic7; ?>">
                </div>
            </div>
            <h2><font color="white">About the Movie</h2>
            <p><?php echo $bio4; ?></p>
        </div>
        <div class="buttons">
            <button id="prev">Prev</button>
            <button id="next">Next</button>
        </div>

正如您在第8行中看到的那样,我包括用于调试目的的打印 我希望此方法从此txt文件返回String:

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;
}

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

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

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

我想了解这里发生的事情。谢谢:)

4 个答案:

答案 0 :(得分: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

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

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

现在,循环头将分配和null检查结合在一起,并且从readLine分配的变量代表从文件读取的最后一行。

答案 1 :(得分: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

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

答案 2 :(得分:0)

好,这里的问题是:您每次调用bufferedReader.readLine(),实际上每次都会读取一个新行,因此第一行在while中被读取并被丢弃,第二行是{{ 1}}-ed,第三个写入文件,依此类推。您需要存储读取的第一行,并以此来工作,例如:

System.out.println

答案 3 :(得分:0)

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