Java:PrintStream 意外自动刷新

标签 java printwriter output printstream autoflush

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/

相关文章:

java - 无法让 PrintWriter 工作

java - 让 PrintWriter 在 Servlet 执行后工作 - 当serversocket接受连接时由套接字客户端调用

c - c 中 int 和 short 的行为

java - JTabbedPane 和 JInternalFrame 哪个更好用?

java - OnTouchListener 没有响应

java - 服务器套接字错误

c - 在 C 中输入的结构和值

java - session getAttribute 为 null Java

java - 如果没有构造函数,我怎样才能让这段代码发挥同样的作用?

Python 裁剪数据库返回的变量