Java - BufferedWriter.write()和System.out.println()的区别是什么?

5

我一直在尝试解决一个名为Chebyshev's Theorem(https://www.acmicpc.net/problem/4948)的算法问题。

我遇到了一个有趣的情况,我还没有弄清楚其中的区别。希望我可以在这里找到答案。

这是我的代码:

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;

public class Solution {
    public static void main(String[] args)  throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        while(true){
            System.out.println("start!!");
            int input = Integer.parseInt(br.readLine());        
            if(input == 0){
                break;
            }
            int ddable = 2*input;
            int answer = 0;
            ArrayList<Integer> base = new ArrayList<>();

            if(input == 1){
                answer = 1;
            }else { 
                System.out.println("It is not 1");
                for(int i = 2 ; i <= ddable ; i++ ){
                    base.add(i);
                }

                for ( int i = 2 ; i <= ddable ; i++ ){
                    for ( int j = 2 ; i*j <=ddable ; j++){
                        if(base.contains(new Integer(i*j))){
                            base.remove(new Integer(i*j));
                            System.out.println(i*j+"removed");
                        }
                    }
                }
                int count = 0;
                for ( int i = input ; i <= ddable ; i++){
                    if(base.contains(new Integer(i))){
                        count++;
                    }
                }
                answer = count;
            }
            System.out.println("syso: "+answer);
            bw.write("bw: "+answer);
        }
        bw.flush();
        br.close();
        bw.close();
    }
}

这是我的结果: enter image description here 从图中可以看出,这只显示了 'System.out.prinln()' 的结果。
为什么会这样呢?

1
从您的屏幕上看,您没有走出while循环,因此flush未被调用,所以无法打印。 - azro
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));通过这行代码,你已经将控制台的输出操作转移到了另一个对象上。但是整体的操作并没有改变。 - soufrk
使用缓冲流的全部意义在于将文本/数据/字节保留在内存中,并仅在需要时推送它,从而通过减少系统调用次数来提高效率。 - Peter Lawrey
2个回答

7
请查看文档

将文本写入字符输出流,缓冲字符以提供单个字符、数组和字符串的高效写入。

您可以调用flushclose确保内容被打印。


4
这是一个简单的问题。
使用“BufferedWriter”打印输出时,需要在想要打印输出的正确时间调用“flush()”。
因此,在代码中,您需要修复这部分内容。
    System.out.println("syso: "+answer);
    bw.write("bw: "+answer);
}
bw.flush();

to

    System.out.println("syso: "+answer);
    bw.write("bw: "+answer);
    bw.flush();
}

然后,它会打印出您想要的结果,即使循环运行,也能正常打印,没有任何问题。
关于'flush()',请参考以下链接:What is the purpose of flush() in Java streams? 它说:
刷新输出流并强制写出任何缓冲的输出字节。刷新的一般契约是,调用它表示,如果输出流的实现已经缓冲了之前写入的任何字节,则这些字节应立即写入它们的预期目标位置。
因此,在调用'write()'后,需要调用'flush()'才能写出。如果'bw'还没有关闭('close()'),则仍然可以重复使用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接