提问人:c-an 提问时间:6/25/2018 最后编辑:c-an 更新时间:6/26/2018 访问量:1864
Java - BufferedWriter.write() 和 System.out.println() 之间的区别?
Java - the difference between BufferedWriter.write() and System.out.println()?
问:
我一直在尝试解决一个叫做切比雪夫定理的算法问题(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();
}
}
这是我的结果:
如您所见,这只显示了“System.out.prinln()”的结果。
原因是什么?
答:
7赞
xingbin
6/25/2018
#1
请参阅文档:
将文本写入字符输出流,缓冲字符,以便 提供单个字符、数组和 字符串。
您可以致电或确保打印内容。flush
close
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()'),它仍然是可重用的。
评论
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
使用此行,您已将控制台输出操作到不同的对象中。但整体操作没有改变。