import java.io.PrintStream;
import java.util.Scanner;
public class OutputTest
{
public static void main(String[] args)
{
Scanner scan = new Scanner(System.in);
PrintStream out = new PrintStream(System.out);
while(true)
{
int in = scan.nextInt();
if(in == 0) break;
System.out.println(in*in);
}
out.flush();
}
}
我期望这个程序获取一个数字列表,每行一个,然后当它达到零时,打印所有的方 block ,每行一个。相反,它只是用方 block 呼应我输入的每个数字。
理想情况下,我实际上会包含以下行:
System.setOut(out);
然后正常编写程序的其余部分(除了最后的刷新),但这具有立即回显的相同结果。
但是,将 PrintStream
更改为 PrintWriter
确实使这项工作按预期进行,但我无法执行 System.setOut
因为 PrintWriter
不扩展 OutputStream
。
为什么这不像我预期的那样?
最佳答案
flush() 在任何流或写入器上意味着“如果有任何内容要刷新,则刷新”。任何流或写入器在手动刷新之前都会进行缓冲,这不是预期的行为。您可以使用缓冲流包装输出流,但当您指定的缓冲区大小已满时,它也会刷新。对于您的情况,最简单的解决方案是写入 StringBuffer,然后在收到零时打印此内容。
关于Java:PrintStream 意外自动刷新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13132170/