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

Java—BufferedWriter.write()和System.out.println()之间的区别是什么?,java,Java,我一直在尝试解决一个叫做切比雪夫定理()的算法问题 我得到了一个有趣的情况。我还没有弄清楚两者之间的区别。我希望我能在这里找到答案 这是我的代码: import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.util.

我一直在尝试解决一个叫做切比雪夫定理()的算法问题

我得到了一个有趣的情况。我还没有弄清楚两者之间的区别。我希望我能在这里找到答案

这是我的代码:

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();
    }
}
导入java.io.BufferedReader;
导入java.io.BufferedWriter;
导入java.io.IOException;
导入java.io.InputStreamReader;
导入java.io.OutputStreamWriter;
导入java.util.ArrayList;
公共类解决方案{
公共静态void main(字符串[]args)引发IOException{
BufferedReader br=新的BufferedReader(新的InputStreamReader(System.in));
BufferedWriter bw=新的BufferedWriter(新的OutputStreamWriter(System.out));
while(true){
System.out.println(“开始!!”;
int input=Integer.parseInt(br.readLine());
如果(输入==0){
打破
}
int ddable=2*输入;
int-answer=0;
ArrayList base=新的ArrayList();
如果(输入=1){
答案=1;
}否则{
System.out.println(“它不是1”);
关于(int i=2;i的信息,请参见:

将文本写入字符输出流,缓冲字符,以便 为有效写入单个字符、数组和 字符串


您可以调用
flush
close
以确保打印内容。

这是一个简单的问题

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

你需要修理这个零件

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

然后,它会打印出您想要的结果,即使循环运行,它也会毫无问题地打印出来

并检查是否有“flush()”:

上面说

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


因此,要写出,您需要在“write()”之后调用“flush()”。如果“bw”还没有关闭(“close()”),它仍然是可重用的。

从屏幕上看,您没有跳出while循环,所以flush没有被调用,所以没有打印
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(System.out))
通过这一行,您已经将控制台输出操作到了另一个对象中。但总体操作没有改变。使用缓冲流的全部目的是将文本/数据/字节保留在内存中,并仅在需要时将其推出,以通过减少系统调用次数来提高效率。
    System.out.println("syso: "+answer);
    bw.write("bw: "+answer);
    bw.flush();
}