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

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

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

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

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

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

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

Чувак. Если вы не закрываете свой stream, ваш юнит-тест завершится неудачей. Или, по крайней мере, должно. Поэтому вам нужно закрыть его. 😉

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

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

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

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

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

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

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

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

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

  • C ++ настраиваемый манипулятор streamа, который изменяет следующий элемент в streamе
  • Как превратить String в InputStreamReader в java?
  • endl и очистка буфера
  • Чтение больших текстовых файлов с streamами в C #
  • Должен ли я вызвать Close () или Dispose () для объектов streamа?
  • Чтение InputStream как UTF-8
  • FileUpload для FileStream
  • Как обрабатывать файл в PowerShell по очереди в streamе
  • Печать входного streamа Java из процесса
  • Вычислить hash из streamа неизвестной длины в C #
  • java-файл с возможностью перемотки назад () / reset ()
  • Давайте будем гением компьютера.