8

这是代码:

File file = new File("Hello.txt");
file.createNewFile();
FileWriter write = new FileWriter(file);
BufferedWriter bufWrite = new BufferedWriter(write);
bufWrite.write("HelloWorld");
bufWrite.flush();
bufWrite.close();

FileReader read = new FileReader(file);
BufferedReader bufRead = new BufferedReader(read);
while(bufRead.read()!=-1){
 System.out.println(bufRead.readLine());
}
bufRead.close();

在这里,输出是 elloWorld。“H”不在那里。为什么会这样?不知道我在这里做错了什么!

4

5 回答 5

12

看看你的循环:

while(bufRead.read()!=-1){
 System.out.println(bufRead.readLine());
}

read在循环中使用 - 这将消耗下一行的第一个字符。

你应该使用:

String line;
while ((line = bufRead.readLine()) != null) {
    System.out.println(line);
}
于 2013-07-30T15:17:40.043 回答
12

这是一个令人惊讶的常见问题。

当你这样做

bufRead.read()

你实际上读了一个字符,它不会把它放回去,让你以后再读。

最简单的解决方案是不这样做。

File file = new File("Hello.txt");
try (PrintWriter pw = new PrintWriter(new FileWriter(file))) {
    pw.println("HelloWorld"); // should have a new line
}

try (BufferedReader br = new BufferedReader(new FileReader(file))) {
    for (String line; (line = br.readLine()) != null; ) {
        System.out.println(line);
    }
}
于 2013-07-30T15:17:59.147 回答
3

这有一个非常简单的原因:这条线

while(bufRead.read()!=-1){

从输入流中消耗一个字符。从文档中

Reads a single character. This method will block until a character is available, an I/O error occurs, or the end of the stream is reached.
于 2013-07-30T15:17:24.390 回答
2

您已经在

while(bufRead.read()!=-1)

如果有不止一行,那么它将消失每行的第一个字符!

所以用

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

read() readLine()

于 2013-07-30T15:29:43.593 回答
0

bufRead.read()读取第一个字符。

bufRead.ready()改为这样做。

于 2013-07-30T15:17:27.203 回答