Будет ли Java System.out.print() буферизоваться навсегда до println()?

Сегодня я услышал спор о System.out.print(). Один человек утверждал, что, поскольку print() не включает завершающий \n, буфер, в который он записывает, в конечном итоге заполнится и начнет терять данные. Другой человек утверждал, что использовал System.out.print() для всех своих Java-программ и никогда не сталкивался с этой проблемой.

Прав ли первый человек? Возможно ли, чтобы System.out.print() начал блокировать или удалять данные, если стандартный вывод заполнен? Есть ли пример кода, который вызовет это?


person Chris Maness    schedule 22.02.2012    source источник
comment
Используйте System.setOut(), чтобы заменить System.out пользовательским потоком, который выдает исключение   -  person calebds    schedule 23.02.2012
comment
они оба неправы. \n не имеет к этому никакого отношения, вызов .close() или .flush() имеет отношение к записи или потере содержимого потока.   -  person    schedule 23.02.2012


Ответы (1)


Когда буфер, используемый 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