使用BufferedReader时,第一个字符被截断

Mer*_*ary 6 java file-io

这是代码:

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

在这里,输出是elloWorld."他不在那里.为什么会这样?不确定我在这里做错了什么!

Jon*_*eet 10

看看你的循环:

while(bufRead.read()!=-1){
 System.out.println(bufRead.readLine());
}
Run Code Online (Sandbox Code Playgroud)

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

你应该使用:

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

  • @PeterLawrey:我可以看到缩小范围的吸引力,但我更喜欢"while"循环,我害怕.对我来说,感觉有点不那么陌生. (3认同)

Pet*_*rey 10

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

当你这样做

bufRead.read()
Run Code Online (Sandbox Code Playgroud)

你实际上读过一个角色,它不会把它放回去,让你以后再读一遍.

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

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

  • +1:尝试使用资源,并保持"line"的范围.这就是它的完成方式. (4认同)