Подтвердить что ты не робот

Когда я закрываю BufferedInputStream, закрывается ли базовый InputStream?

InputStream in = SomeClass.getInputStream(...);
BufferedInputStream bis = new BufferedInputStream(in);

try {
    // read data from bis
} finally {
    bis.close();
    in.close();    
}

В javadoc для BufferedInputStream.close() не упоминается, закрыт ли базовый поток:

Закрывает этот входной поток и освобождает связанные с ним системные ресурсы с потоком. Как только поток будет закрыт, далее прочитайте(), доступных(), reset() или skip() вызовет исключение IOException. Закрытие ранее закрытого потока не влияет.

Является ли явный вызов in.close() необходимым или должен быть закрыт вызовом bis.close()?

4b9b3361

Ответ 1

Из исходного кода BufferedInputStream:

public void close() throws IOException {
    byte[] buffer;
    while ( (buffer = buf) != null) {
        if (bufUpdater.compareAndSet(this, buffer, null)) {
            InputStream input = in;
            in = null;
            if (input != null)
                input.close();
            return;
        }
        // Else retry in case a new buf was CASed in fill()
    }
}

Таким образом, ответ будет следующим: ДА

Ответ 2

Когда вы закрываете BufferedInputStream, базовый InputStream действительно также закрыт.:)

Ответ 3

Дозатор BufferedInputStream удерживает любые системные ресурсы сам, он просто обтекает InputStream, который содержит эти ресурсы. Это означает, что BufferedInputStream сам не имеет ничего закрывать, поэтому переводит операцию закрытия на обернутый InputStream, который затем освобождает свои ресурсы.

Ответ 4

Да. Основной поток будет закрыт.

Ответ 5

Вот реализация Java

/**
 * Closes this input stream and releases any system resources
 * associated with the stream.
 * Once the stream has been closed, further read(), available(), reset(),
 * or skip() invocations will throw an IOException.
 * Closing a previously closed stream has no effect.
 *
 * @exception  IOException  if an I/O error occurs.
 */
public void close() throws IOException {
    byte[] buffer;
    while ( (buffer = buf) != null) {
        if (bufUpdater.compareAndSet(this, buffer, null)) {
            InputStream input = in;
            in = null;
            if (input != null)
                input.close();
            return;
        }
        // Else retry in case a new buf was CASed in fill()
    }
}

Итак, поток будет закрыт