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

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

Ответ 1

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

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

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

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

Ответ 2

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

Ответ 3

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

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

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

Ответ 4

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

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

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

Ответ 5

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

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

Ответ 6

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

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