Когда буфер, используемый System.out.print
, заполняется, выходные данные записываются в файл (или в терминал, или в другую цель данных, подключенную к стандартному потоку вывода программы), в результате чего буфер становится пустым. Запись вывода, не заботясь о размере буфера, является нормальным использованием. Вы никогда не сломаетесь, не заблокируете свою программу или не потеряете данные, если не вызовете flush
.
Вам нужно вызвать flush
только в том случае, если вам нужно немедленно сделать данные доступными вне вашей программы. Например, если ваша программа обменивается данными туда и обратно с другой программой, и вы отправляете запрос этой программе и ждете ответа этой программы, вам нужно вызвать flush
после отправки вашего запроса, чтобы гарантировать, что другая программа получит Это. Точно так же, если ваша программа (или машина, на которой она работает) дает сбой, гарантированно будет записан только вывод до последнего вызова flush
.
Если поток настроен на автоматическую очистку, то запись символа новой строки (явно или через println
) так же хороша, как вызов flush
. Вызов close
также вызывает flush
(поэтому close
может вызвать IOException
: возможно, ему придется записать данные, но он не сможет этого сделать, например, из-за того, что поток подключен к файлу на полном диске).
Обратите внимание, что очистка буфера может привести к блокировке программы, если поток, к которому подключен System.out
, не готов к немедленному приему данных (например, когда данные передаются в другую программу, которая не считывает свой ввод немедленно). Поскольку буфер может быть очищен в любое время (поскольку буфер оказывается заполненным), любой вызов print
с непустым аргументом потенциально блокируется.
Дополнительную информацию см. в руководстве по буферизованным потокам и в документации java.io.PrintStream
класс.
person
Gilles 'SO- stop being evil'
schedule
23.02.2012
System.setOut()
, чтобы заменитьSystem.out
пользовательским потоком, который выдает исключение - person calebds   schedule 23.02.2012\n
не имеет к этому никакого отношения, вызов.close()
или.flush()
имеет отношение к записи или потере содержимого потока. - person   schedule 23.02.2012