Закрытие вложенного потока также закрывает его родительские потоки?
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
}
Да, это так. но странно, когда я запускал сканирование с включенной функцией поиска, он ловит все эти обернутые и незакрытые потоки как элементы с высоким приоритетом, которые нужно исправить. Не уверен, почему они так делают