Примечание.. Этот вопрос и большинство его ответов датируются до выпуска Java 7. Java 7 предоставляет Автоматическое управление ресурсами для этого легко. Если вы используете Java 7 или более позднюю версию, вы должны перейти на ответ Росса Джонсона.
Что считается лучшим, наиболее полным способом закрытия вложенных потоков на Java? Например, рассмотрите настройку:
FileOutputStream fos = new FileOutputStream(...)
BufferedOS bos = new BufferedOS(fos);
ObjectOutputStream oos = new ObjectOutputStream(bos);
Я понимаю, что операция закрытия должна быть застрахована (возможно, с помощью предложения finally). Что мне интересно, так это необходимо, чтобы явным образом убедиться, что вложенные потоки закрыты, или достаточно ли просто закрыть внешний поток (oos)?
Одна вещь, которую я замечаю, по крайней мере, имея дело с этим конкретным примером, состоит в том, что внутренние потоки только бросают FileNotFoundExceptions. Это, по-видимому, подразумевает, что технически не нужно беспокоиться о том, чтобы закрыть их, если они потерпят неудачу.
Вот что написал коллега:
Технически, если бы оно было реализовано правильно, закрытие внешнего потока (oos) должно быть достаточно. Но реализация кажется ошибочной.
Пример: BufferedOutputStream наследует close() от FilterOutputStream, который определяет его как:
155 public void close() throws IOException {
156 try {
157 flush();
158 } catch (IOException ignored) {
159 }
160 out.close();
161 }
Однако, если flush() по какой-то причине выбрасывает исключение во время выполнения, то out.close() никогда не будет вызван. Так что кажется "самым безопасным" (но уродливым) в основном беспокоятся о закрытии FOS, который сохраняет файл открытым.
Что лучше всего подходит для рук, когда-вам-абсолютно необходимо, чтобы приблизиться к закрытию вложенных потоков?
И есть ли какие-либо официальные документы Java/Sun, которые справляются с этим в мельчайших подробностях?