Какой смысл в том, чтобы не закрывать InputStream после его завершения? - PullRequest
5 голосов
/ 08 сентября 2010

InputStream реализует Closeable.

Я понимаю, что закрытие InputStream , который еще не закончился , может иметь смысл для освобождения некоторых базовых ресурсов, и, оставляя его открытым, может иметь смысл позволить другим методам продолжать чтение из него. 1007 *

Но какой смысл иметь , а не , чтобы закрыть InputStream после его окончания ?
И если это не имеет смысла, то почему достижение конца InpuntStream не подразумевает закрытие?

Тот же вопрос будет применяться к Reader.

Ответы [ 7 ]

9 голосов
/ 08 сентября 2010

mark() и reset() позволяют вам «вернуться» в некоторых реализациях интерфейса.

Это полезно при реализации синтаксических анализаторов и сопоставлении регулярных выражений, как обычно вы хотите lookahead .

3 голосов
/ 08 сентября 2010

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

3 голосов
/ 08 сентября 2010

В ответ на ваш комментарий к org.life.java

Я знаю, и вопрос был: почему конец InputStream не подразумевает закрыть ()

Потому что для некоторых потоков вы можете перемотать их и начать читать снова. Для других, например Сокеты, это невозможно, но они должны подчиняться правилам контракта.

Также, потому что именно так вы должны закрыть поток (обработка исключений не показана):

InputStream stream = openMethod( );

try
{
   consumeMethod( stream );
}
finally
{
   stream.close( );
}

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

1 голос
/ 08 сентября 2010

Вы можете mark() и reset() InputStream.Поэтому, как только вы достигнете конца данных, вы все равно сможете вернуться к позиции, которую вы отметили.Тот, кто хочет reset() InputStream, возможно, не захочет закрыть его в конце.

0 голосов
/ 08 сентября 2010

Судя по API InputStream, для конкретной реализации не возникает никаких проблем, т. Е. Близко к концу потока. Это, вероятно, очень хорошая идея для множества потоков.

0 голосов
/ 08 сентября 2010

Неявное закрытие не было бы так хорошо, потому что

  • это будет сделано только тогда, когда поток достигнет своего конца, что может быть не всегда (некоторые исключения происходят в пути, или вы только читаете первые байты файла), поэтому вам придется обрабатывать эти другие в любом случае. Наличие неявного закрытия, которое почти всегда работает, делает людей еще более забывчивыми об их окончательных блоках.
  • некоторые потоки можно перематывать (пометить / сбросить).
0 голосов
/ 08 сентября 2010

Мне не известна семантика, связанная с InputStream в java, но в целом вы не можете закрыть поток, потому что вы не открыли его самостоятельно и просто работали над ним, и полагаетесь на вызывающую сторону (другойметод), чтобы закрыть поток.Если вы открыли поток самостоятельно, вы всегда должны его закрывать.

...