2
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();
    }

}

我期待这个程序获取一个数字列表,每行一个,然后当它达到零时,打印所有的正方形,每行一个。相反,它只是呼应我用方块输入的每个数字。

理想情况下,我实际上会包括以下行:

System.setOut(out);

然后正常编写我的程序的其余部分(除了最后的刷新),但这具有立即回显的相同结果。

但是,将 更改PrintStream为 aPrintWriter确实可以按预期进行这项工作,但是我不能这样做,System.setOut因为PrintWriter不会扩展OutputStream.

为什么这不符合我的预期?

4

1 回答 1

2

任何流或写入器上的 flush() 表示“如果有任何要刷新的内容,则刷新”。在手动刷新之前,任何流或写入器都不会缓冲的预期行为。您可以使用缓冲流包装输出流,但当您指定的缓冲区大小已满时,它也会刷新。在您的情况下,最简单的解决方案是写入 StringBuffer ,然后在收到零时打印它。

于 2012-10-30T03:48:07.830 回答