为什么 Scanner 对象会影响 BufferedWriter 写入文件的能力?

Why is the Scanner object affecting the BufferedWriter's ability to write to a file?

提问人:Dani 提问时间:11/29/2021 最后编辑:Dani 更新时间:11/29/2021 访问量:58

问:

我正在尝试从给定的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 写入文本文件?我没有考虑什么?任何帮助/反馈将不胜感激!

java file-io java.util.scanner 文件写入 bufferedwriter

评论

0赞 Sweeper 11/29/2021
打电话会产生预期的行为吗?flush
0赞 Dani 11/29/2021
仅适用于前 35 行(如所写),但它必须写入数百行。我编辑了帖子以澄清。

答:

0赞 Sweeper 11/29/2021 #1

Scanner 实例如何阻止 BufferedWriter 写入文本文件?

好吧,那么我会说这仅仅是因为阻止了您的程序,以便您有时间打开文件并检查是否编写了任何内容。input.nextLine

如果你不这样做,在缓冲区已满(并且你的文本文件的 35 行显然没有填满缓冲区)或直到你关闭文件之前,实际上不会写入任何内容。这是缓冲写入器的主要功能,而不是非缓冲写入器。flush

您是否有扫描仪并不重要。只是没有扫描仪,程序运行得太快,您只能在文件关闭后检查文件,此时所有内容都会写入其中。

此外,无论执行 if 语句的哪个分支,您都应该递增,否则一旦达到 35,它就会不断命中“if”分支,等待您按回车键。PAGE_LENGTHPAGE_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
谢谢!这对于了解正在发生的事情和原因非常有帮助。感谢您的回复,我让我的程序正常工作。我没有意识到它只需要到达程序的末尾才能写入文件!