为什么 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 行限制之前,作者正确地编写了一个文本文件。我试过在循环中加入writer.flush();,结果只写了35行,所以我知道问题一触发'if'语句就出现了(肯定要写几百行文字) .我注意到,如果我注释掉 input.nextLine();,作者会再次运行。

Scanner 实例如何阻止 BufferedWriter 写入文本文件?我没有考虑什么?任何 help/feedback 将不胜感激!

How is the Scanner instance preventing BufferedWriter from writing the text file?

好吧,那我就说那只是因为input.nextLine阻塞了你的程序,让你有时间打开文件看看有没有什么写了。

如果您不 flush,在缓冲区满之前 实际上 不会写入任何内容(并且您的文本文件的 35 行没有填满缓冲区显然),或者直到您关闭文件。这是 缓冲 ​​ 写入器的主要特征,与非缓冲写入器相对。

有没有扫描仪并不重要。只是如果没有扫描仪,程序运行速度太快,你只能在文件关闭后才能查看,此时所有内容都已写入其中。

另外,无论if语句执行到哪个分支,都应该递增PAGE_LENGTH,否则会一直命中“if”分支,等你回车,一次PAGE_LENGTH达到 35.

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