Закрытие вложенного потока также закрывает его родительские потоки?

OutputStream fos;
OutputStream bos;
OutputStream zos;
try {
    fos = new FileOutputStream(anyFile);
    bos = new BufferedOutputStream(fos);
    zos = new ZipOutputStream(bos);
} finally {
    if (zos != null) {
        zos.close(); // + exception handling
    }
}

Делает закрытие zos автоматически закрывается bos а также fos тоже или мне нужно закрывать их вручную?

4 ответа

Решение

Да, это так. Его Javadoc говорит:

Закрывает поток вывода ZIP, а также фильтруемый поток.

Кроме того, Javadoc дляBufferedOutputStream говорит:

Закрывает этот выходной поток и освобождает все системные ресурсы, связанные с этим потоком.

close метод FilterOutputStream называет его flush метод, а затем вызывает close метод его основного выходного потока.

Поэтому, когда вы закрываете ZipOutputStream, это закроет ваш BufferedOutputStream, который в свою очередь закроет ваш FileOutputStream,

Да.

ZipOutputStream.close() метод определяется Closeable.close() который:

Закрывает этот поток и освобождает любые системные ресурсы, связанные с ним.

То же самое относится и к BufferedOutputStream.close(), метод, унаследованный от FilterOutputStream,

Закрытие потока-оболочки автоматически закрывает внутренний поток.

Итак, в вашем случае вам нужно только закрыть ZipOutputStream, Закрытие потока дважды не вызывает исключения, следовательно, закрытие внутреннего потока снова (хотя и не обязательно) также работает.

Вот что происходит, когда вы создаете ZipOutputStream

public ZipOutputStream(OutputStream out) {
    this.out = out; // BufferedOutputStream reference saved
}

Вот реализация ZipOutputStream.close()

public void close() throws IOException {
    try {
      flush();
    } catch (IOException ignored) {
    }
    out.close(); // BufferedOutputStream being closed
}

Так же, BufferedOutputStream автоматически закрывает FileOutputStream через наследство FilterOutputStream#close() который был реализован как:

public void close() throws IOException {
    try {
      flush();
    } catch (IOException ignored) {
    }
    out.close(); // FileOutputStream being closed
}

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

Другие вопросы по тегам