Скажем, я делаю что-то вроде:
Reader r = new BufferedReader(new FileReader(file));
... read ...
r.close()
Закрывает ли этот основной файл FileReader (и освобождает дескриптор открытого файла)?
-Dave
Скажем, я делаю что-то вроде:
Reader r = new BufferedReader(new FileReader(file));
... read ...
r.close()
Закрывает ли этот основной файл FileReader (и освобождает дескриптор открытого файла)?
-Dave
Да, вызов 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, даже если они не могут явно сказать это.
Согласно документации, он просто "освобождает любые системные ресурсы, связанные с [читателем]". Независимо от того, закрывает ли читатель любые вложенные читатели, речь идет о реализации конкретного класса.
В конкретном примере, который вы упоминали - да, a BufferedReader
всегда будет закрывать вложенного читателя. Но в то время как это обычно происходит, это не обязательно означает, что все реализации интерфейса Reader
, которые имеют какой-то вложенный читатель, будут распространять вызов close()
через них - вам нужно будет проверить документацию этого конкретного класс, чтобы узнать.
Да. Оно делает. Я нашел это при использовании его для сокетов.
В принципе, вы просто не можете закрыть его, пока не закончите с родителем. В случае сокетов это фактически закроет ваш сокет.: - (
Да, это шаблон Decorator.