Закрывает ли stream.close все включающие потоки?

1

AFAIK, вызов close в потоке (I/O) закрывает любые базовые потоки, включая сам.
Верно ли обратное?

Например:

InputStream inStream = new FileInputStream("abc.txt"); 
BufferedInputStream bin = new BufferedInputStream(inStream);
inStream.close();  

Будет ли это закрывать bin?
Если нет, нужно ли это делать? т.е.: это приведет к утечке памяти?

Теги:
stream

2 ответа

2
Лучший ответ

Будет ли это закрывать bin?

Закрытый поток не может закрыть вмещающий поток, потому что он не знает об этом.

Если нет, нужно ли это делать? т.е.: это приведет к утечке памяти?

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

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

Промывка входящего потока не всегда достаточно, потому что для базового потока, который содержит достоверные данные, входящий поток может добавить дополнительное дополнение или форматирование. Примером этого является ZipOutputStream который для обеспечения действительного zip файла (zip-формат) предоставляет метод ZipOutputStream.finish() который, кроме того, ZipOutputStream.finish() промывку и записывает дополнительные данные, связанные с zip файлом (и не закрывает базовый поток).

Вы можете найти это полезным:

Закрыть Encapsulating Writers/Streams для ServletOutputStream

  • 0
    Очень полезно на самом деле. Thanx
1

Будет ли это закрывать бин?

Нет. (У wrapped InputStream нет ссылки на BufferedInputStream. Он не мог закрыть его, даже если он "хотел".)

Если нет, нужно ли это делать?

На самом деле, нет. (Однако хорошей практикой является закрытие потока оболочки, а не завернутого потока... из-за "выходного" случая, см. Ниже.)

т.е.: это приведет к утечке памяти?

Определенно нет. И не утечка ресурсов:

  • Из вышеизложенного BufferedInputStream недоступен из InputStream, и поэтому операции над последним не могут повлиять на доступность первого.

  • BufferedInputStream не "владеет" внешними ресурсами (например, файловыми дескрипторами). Они принадлежат и управляются InputStream.


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

  • 0
    Да, это то, что я думал, не будет ресурсов для утечки. Благодарю.
  • 0
    Спасибо. за ваш вклад .. я удалил свой ответ

Ещё вопросы

Сообщество Overcoder
Наверх
Меню