Закрытие потоков в Java - PullRequest
       10

Закрытие потоков в Java

51 голосов
/ 05 февраля 2009

Почему нам нужно закрыть FileInputStream (и потоки в целом) в любом случае , прежде чем мы покинем программу? Что будет иначе? Если программа останавливается до явного закрытия входного потока в программе, разве поток не закрывается автоматически?

Ответы [ 6 ]

45 голосов
/ 05 февраля 2009

Файловые дескрипторы ограничены, ограничены в ресурсах. Вы можете исчерпать их, если не очистите их должным образом, как соединения с базой данных.

Если вы написали небольшую программу только с одним пользователем, вы можете избежать неряшливости и не закрываться в блоке finally.

Но если вы в конечном итоге используете эту идиому в приложении, в котором много пользователей и файловых дескрипторов, у вас может возникнуть проблема.

«Сначала мы приобретаем привычки, а потом нас». Я стараюсь применять лучшие практики, даже когда они не нужны.

36 голосов
/ 05 февраля 2009

Да, когда процесс завершится, неуправляемые ресурсы будут освобождены. Для InputStreams это нормально. Для OutputStreams вы можете потерять буферизованные данные, поэтому вы должны как минимум очистить поток перед выходом из программы.

25 голосов
/ 05 февраля 2009

Чувак. Если вы не закроете свой поток, ваш модульный тест не пройдёт. Или, по крайней мере, так и должно быть. Итак, вот почему вы должны закрыть его. ;)

И хотя ОС почти наверняка очистится, если вы просто выйдете, они, как правило, будут освобождены быстрее, если вы явно закроете их. Кроме того, что если ваш код в конечном итоге окажется в долго работающей программе? Тогда у них будут проблемы и они тебя проклянут. (

Итак, это как мыть руки после посещения ванной комнаты. В конце концов кто-то заплатит цену, если вы этого не сделаете. Вы можете сойти с рук на некоторое время, но это все еще хорошая практика.

10 голосов
/ 05 февраля 2009

В дополнение к ответу Джона, обычно хорошей идеей является закрытие любого ресурса.

Подумайте о подключении к базе данных. В вашей базе данных не может быть открыто бесконечное количество подключений, в этом случае, если она вам не нужна, лучше закрыть ее, как только закончите.

Также полезно сделать это привычкой. Блок "Наконец-то" - твой друг. В случае C ++ вы также можете использовать RAII для автоматического управления этим .

7 голосов
/ 05 февраля 2009

Вроде. Поток поддерживается «реальным» дескриптором файла операционной системы, и когда процесс завершается, ОС очищает все дескрипторы открытых файлов.

В любом случае, хорошей практикой является всегда закрывать ваши ресурсы, когда вы закончите, поэтому закройте потоки:)

6 голосов
/ 05 февраля 2009

Если вы не закрываете потоки, у вас могут возникнуть проблемы с их повторным открытием. Это особенно верно, если они свисают с конца сокетов.

Закрытие потока также гарантирует, что данные пропускаются через поток, если остались какие-либо данные для отправки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...