Когда и почему вызывать System.out.flush() в Java
Почему определенные потоки должны быть сброшены (FileOutputStream
а потоки из сокетов) а стандартного потока вывода нет?
Каждый раз, когда кто-то использует System.out
PrintStream
объект, будь то во время разговора 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
это не должно быть проблемой. Смотрите эту статью для получения дополнительной информации.