Java: PrintStream неожиданно автоматически смывает

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 к PrintWriter сделал эту работу, как ожидалось, однако я не могу сделать System.setOut поскольку PrintWriter не распространяется OutputStream,

Почему это не так, как я ожидаю?

1 ответ

flush() в любом потоке или пишущем означает "flush, если есть что очистить". Это не ожидаемое поведение, которое любой поток или записывающее устройство будет буферизировать перед ручной очисткой. Вы можете обернуть выходной поток буферным потоком, но он также сбрасывается, когда указанный вами размер буфера заполнен. Самое простое решение в вашем случае - это написать в StringBuffer, а затем напечатать это при получении нуля.

Другие вопросы по тегам