Java-буферы и потоки: высвобождение базовых ресурсов - PullRequest
2 голосов
/ 12 февраля 2011

Дело 1:

BufferedReader br = new BufferedReader( new InputStreamReader( new FileInputStream(file) ) );
br.close();

Дело 2:

BufferedReader br = new BufferedReader( new FileReader(file) );
br.close();

Дело 3:

InputStream bis = new BufferedInputStream( new FileInputStream(src) );
bis.close();

Что делает close()?

Документы говорят: «Закрывает поток и освобождает любые связанные с ним системные ресурсы».

Закрывает ли он также какие-либо «базовые» ресурсы?все буферы и потоки и закрыть по одному?

Ответы [ 4 ]

2 голосов
/ 12 февраля 2011

Да, базовые ресурсы высвобождаются.Классы потоков Java IO являются хорошим примером шаблона Decorator , то есть объекта, интерфейс которого идентичен объекту, который он содержит.Это позволяет методу close() быть очень простым и элегантным, например что-то вроде:

public void close() {
  in.close();
}

Если in сам является декоратором, его метод close рекурсивно закроет другой ресурс.

Если вам интересно, java.io исходный код можно посмотреть онлайн здесь .

1 голос
/ 12 февраля 2011

Закрывает ли он также какие-либо "базовые" ресурсы?

Да

Или правильный код - создать все буферы и потоки и закрыть один за другим?

Нет, выне нужно этого делать.

Я всегда считал недостатком документов, что это прямо не указано.Однако это подразумевается словами «любые системные ресурсы, связанные с ним».Так как даже с дополнительным слоем посередине ваш BufferedReader по-прежнему связан с файлом, чтобы соответствовать документу, который он должен использовать в своих обернутых потоках.После того, как эти ресурсы были освобождены, сборщик мусора становится только заданием, когда на ваш поток перестают ссылаться.

0 голосов
/ 12 февраля 2011

Как правило, вызовы close() будут каскадно проходить через базовые объекты.

0 голосов
/ 12 февраля 2011

вам нужно только закрыть самый внешний класс потока, потому что вызов close () автоматически обрабатывается всеми связанными классами.

public void close () создает IOException Description, скопированное из класса: Reader

Закрывает поток и освобождает любые системные ресурсы, связанные с ним.Как только поток будет закрыт, дальнейшие вызовы read (), ready (), mark (), reset () или skip () вызовут IOException.Закрытие ранее закрытого потока не имеет никакого эффекта.

http://download.oracle.com/javase/6/docs/api/java/io/BufferedReader.html#close%28%29

...