Когда и почему вызывать System.out.flush() в Java

Почему определенные потоки должны быть сброшены (FileOutputStream а потоки из сокетов) а стандартного потока вывода нет?

Каждый раз, когда кто-то использует System.outPrintStream объект, будь то во время разговора println() или же write()они никогда не смывают поток. Однако другие программисты обычно называют flush() PrintStream/PrintWriter с другими потоками.

Я недавно задавал этот вопрос нескольким программистам, и некоторые считают, что в Java есть некоторая фоновая обработка для автоматической очистки System.out поток, но я не могу найти документацию по этому вопросу.

Что-то вроде этого заставляет меня задуматься, просто ли System.out.println() не зависит от платформы, так как некоторым системам может потребоваться очистить поток.

4 ответа

Решение

System.out основан на PrintStream который по умолчанию сбрасывается при написании новой строки.

Из Javadoc:

autoFlush - логическое значение; если true, выходной буфер будет очищаться всякий раз, когда записывается байтовый массив, один из println методы, или символ новой строки или байт ('\n') написано

Итак println если вы упомянули, явно обрабатывается, и write случай с byte[] также гарантированно сбрасывается, потому что он попадает под "всякий раз, когда записывается байтовый массив".

Если вы замените System.out с помощью System.setOut и не используйте поток автоматической очистки, тогда вам придется очищать его, как любой другой поток.

Библиотечный код, вероятно, не следует использовать System.out напрямую, но если это так, то следует тщательно очистить, потому что пользователь библиотеки может переопределить System.out использовать поток без промывки.

Любая Java-программа, которая записывает двоичный вывод в System.out следует быть осторожным с flush до exit потому что двоичный вывод часто не содержит завершающий перевод строки.

Если вы не можете дождаться отображения элемента, очистите поток.

Когда JVM выходит из строя, отсутствие очистки потока может привести к потере элемента в буфере отображения, что может привести к появлению разумного сообщения об ошибке, сообщающего, почему JVM вышла из строя навсегда. Это делает отладку намного более сложной, как тогда говорили люди, "но она не попала сюда, потому что это напечатало бы это".

От PrintStream документация:

При желании PrintStream может быть создан для автоматической очистки; это означает, что flush Метод автоматически вызывается после записи байтового массива, один из println методы, или символ новой строки или байт ('\n') написано.

Хотя я не вижу, что это явно упоминается в документации, я понимаю, что System.out будет выполнять эту автоматическую промывку.

System.out по умолчанию является линейно-буферизованным. Так что если вы звоните println и не print это не должно быть проблемой. Смотрите эту статью для получения дополнительной информации.

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