提问人:Dani 提问时间:11/29/2021 最后编辑:Dani 更新时间:11/29/2021 访问量:58
为什么 Scanner 对象会影响 BufferedWriter 写入文件的能力?
Why is the Scanner object affecting the BufferedWriter's ability to write to a file?
问:
我正在尝试从给定的URL中读取文本内容,然后打印内容,并使用BufferedWriter将其写入文本文件。我需要包含一个代码块,该代码块一次只允许打印 35 行文本,直到用户使用 Scanner 实例按回车键,但立即写入整个文本文件。所有这些都必须在 try-with-resource 块中完成。这是我的代码:
try(InputStream stream = url.openStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
BufferedWriter writer = new BufferedWriter(new FileWriter(file, true))){
Scanner input = new Scanner(System.in);
String newLine;
int PAGE_LENGTH = 1;
while(((newLine = reader.readLine()) != null)) {
writer.write(newLine + "\n");
//writer.flush();
if(PAGE_LENGTH % 35 == 0) {
System.out.println("\n- - - Press Enter to Continue - - -");
input.nextLine();
}
else {
System.out.println(newLine);
PAGE_LENGTH++;
}
}
writer.close();
}
在实施 35 行限制之前,编写器正确地编写了文本文件。我尝试在循环中添加,结果只写了 35 行,所以我知道一旦触发“if”语句(它必须写几百行文本),问题就会发生。我注意到,如果我注释掉,作者会再次发挥作用。writer.flush();
input.nextLine();
Scanner 实例如何阻止 BufferedWriter 写入文本文件?我没有考虑什么?任何帮助/反馈将不胜感激!
答:
0赞
Sweeper
11/29/2021
#1
Scanner 实例如何阻止 BufferedWriter 写入文本文件?
好吧,那么我会说这仅仅是因为阻止了您的程序,以便您有时间打开文件并检查是否编写了任何内容。input.nextLine
如果你不这样做,在缓冲区已满(并且你的文本文件的 35 行显然没有填满缓冲区)或直到你关闭文件之前,实际上不会写入任何内容。这是缓冲写入器的主要功能,而不是非缓冲写入器。flush
您是否有扫描仪并不重要。只是没有扫描仪,程序运行得太快,您只能在文件关闭后检查文件,此时所有内容都会写入其中。
此外,无论执行 if 语句的哪个分支,您都应该递增,否则一旦达到 35,它就会不断命中“if”分支,等待您按回车键。PAGE_LENGTH
PAGE_LENGTH
if(PAGE_LENGTH % 35 == 0) {
System.out.println("\n- - - Press Enter to Continue - - -");
input.nextLine();
}
else {
System.out.println(newLine);
}
// move this outside of the if statement!
PAGE_LENGTH++;
评论
0赞
Dani
11/29/2021
谢谢!这对于了解正在发生的事情和原因非常有帮助。感谢您的回复,我让我的程序正常工作。我没有意识到它只需要到达程序的末尾才能写入文件!
评论
flush