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

Java: делает ли Reader.close() закрытие всех закодированных читателей?

Скажем, я делаю что-то вроде:

Reader r = new BufferedReader(new FileReader(file));

... read ...

r.close()

Закрывает ли этот основной файл FileReader (и освобождает дескриптор открытого файла)?

-Dave

4b9b3361

Ответ 1

Да, вызов close на внешнем большинстве Reader будет достаточным.

Java I/O Streams в статье Sun Developer Сеть содержит раздел о цепочке потоков, в котором говорится следующее:

FileOutputStream  fos = new FileOutputStream("myfile.out");   
CryptOutputStream cos = new CryptOutputStream(fos);   
GZIPOutputStream  gos = new GZIPOutputStream(cos);

[...]

[...] при закрытии прикованных потоки, вам нужно только закрыть внешний класс потока, поскольку close() вызов автоматически просачивается через все связанные классы; в пример выше, вы просто вызовите метод close() на GZIPOutputStream класс.

Поэтому в этом случае нужно было бы называть close на BufferedReader.

Как уже упоминалось dtsazza, Спецификация Java API для BufferedReader говорит, что метод BufferedReader.close будет бесплатные базовые ресурсы:

Закрывает поток и освобождает связанные с ним системные ресурсы. [...]

Итак, можно сделать вывод, что любые базовые Reader s, даже если они не могут явно сказать это.

Ответ 2

Согласно документации, он просто "освобождает любые системные ресурсы, связанные с [читателем]". Независимо от того, закрывает ли читатель любые вложенные читатели, речь идет о реализации конкретного класса.

В конкретном примере, который вы упоминали - да, a BufferedReader всегда будет закрывать вложенного читателя. Но в то время как это обычно происходит, это не обязательно означает, что все реализации интерфейса Reader, которые имеют какой-то вложенный читатель, будут распространять вызов close() через них - вам нужно будет проверить документацию этого конкретного класс, чтобы узнать.

Ответ 3

Да. Оно делает. Я нашел это при использовании его для сокетов.

Мой вопрос

В принципе, вы просто не можете закрыть его, пока не закончите с родителем. В случае сокетов это фактически закроет ваш сокет.: - (

Ответ 4

Да, это шаблон Decorator.