Java - BufferedWriter.write() 和 System.out.println() 之间的区别?

Java - the difference between BufferedWriter.write() and System.out.println()?

提问人:c-an 提问时间:6/25/2018 最后编辑:c-an 更新时间:6/26/2018 访问量:1864

问:

我一直在尝试解决一个叫做切比雪夫定理的算法问题(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赞 azro 6/25/2018
从您的屏幕上,您没有退出 while 循环,因此不调用刷新,因此没有打印
0赞 soufrk 6/25/2018
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));使用此行,您已将控制台输出操作到不同的对象中。但整体操作没有改变。
0赞 Peter Lawrey 6/25/2018
使用缓冲流的全部意义在于将文本/数据/字节保留在内存中,并且仅在需要时将其推出,以通过减少系统调用次数来提高效率。

答:

7赞 xingbin 6/25/2018 #1

请参阅文档

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

您可以致电或确保打印内容。flushclose

4赞 c-an 6/25/2018 #2

这是一个简单的问题。

要使用“BufferedWriter”打印出某些内容,您需要在要打印的正确时间调用“flush()”。 所以,在代码中。

您需要修复此部分。

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

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

然后,它会打印您想要的结果,即使循环运行,它也能正常打印而不会出现任何问题。

并检查一下 'flush()' : flush() 在 Java 流中的目的是什么?

它说

刷新输出流并强制写出任何缓冲的输出字节。flush 的一般契约是,调用它表示,如果先前写入的任何字节已被输出流的实现缓冲,则应立即将此类字节写入其预期目的地。

因此,要写出,您需要在 'write()' 之后调用 'flush()'。如果 'bw' 尚未关闭('close()'),它仍然是可重用的。