Czy muszę zamknąć () zarówno FileReader jak i BufferedReader?

Czytam lokalny plik za pomocą Bufferedreadera owiniętego wokół FileReader:

BufferedReader reader = new BufferedReader(new FileReader(fileName));
// read the file
// (error handling snipped)
reader.close();

Czy ja też muszę close() FileReader, czy owijka sobie z tym poradzi? Widziałem Kod gdzie ludzie robią coś takiego:

FileReader fReader = new FileReader(fileName);
BufferedReader bReader = new BufferedReader(fReader);
// read the file
// (error handling snipped)
bReader.close();
fReader.close();

Ta metoda jest wywoływana z servletu i chciałbym się upewnić, że nie zostawiam żadnych otwartych uchwytów.

Author: Alberto Zaccagni, 2009-09-07

7 answers

Nie.

BufferedReader.close()

Zamyka strumień zgodnie z javadoc dla BufferedReaderi InputStreamReader

Jak również

FileReader.close()
Tak.
 189
Author: Atmocreations,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-12 20:46:23

Jak zauważyli inni, wystarczy tylko zamknąć zewnętrzną owijkę.

BufferedReader reader = new BufferedReader(new FileReader(fileName));

Istnieje bardzo mała szansa, że może to spowodować wyciek pliku, jeśli konstruktor BufferedReader wyrzuci wyjątek (np. OutOfMemoryError). Jeśli Twoja aplikacja jest w tym stanie, to, jak ostrożne musi być czyszczenie, może zależeć od tego, jak ważne jest, aby nie pozbawiać systemu operacyjnego zasobów, które może chcieć przeznaczyć na inne programy.

Interfejs Closeable może być używany, jeśli konstruktor wrappera jest prawdopodobnie nie uda się w Javie 5 lub 6:

Reader reader = new FileReader(fileName);
Closeable resource = reader;
try {
  BufferedReader buffered = new BufferedReader(reader);
  resource = buffered;
  // TODO: input
} finally {
  resource.close();
}

Kod Javy 7 powinien używać wzoru try-with-resources :

try (Reader reader = new FileReader(fileName);
    BufferedReader buffered = new BufferedReader(reader)) {
  // TODO: input
}
 87
Author: McDowell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-31 07:57:23

Według źródła BufferedReader, w tym przypadku bReader.freader z bliska.Zamknij, więc technicznie nie musisz dzwonić do tego drugiego.

 6
Author: Csaba_H,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-07 10:19:57

Kod źródłowy BufferedReader pokazuje, że element bazowy jest zamknięty po zamknięciu Bufferedreadera.

 4
Author: Brian Agnew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-07 10:20:11

Po sprawdzeniu kodu źródłowego znalazłem, że dla przykładu:

FileReader fReader = new FileReader(fileName);
BufferedReader bReader = new BufferedReader(fReader);

Metoda close() w obiekcie BufferedReaderwywoła metodę abstract close() klasy Reader, która ostatecznie wywoła metodę zaimplementowaną w klasie inputstreamreader, która następnie zamyka obiekt InputStream.

Więc tylko panierka.close() jest wystarczające.
 3
Author: Anup Verma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-02 18:00:08

Wystarczy zamknąć bufferedReader czyli czytnik.zamknij () i będzie działać dobrze .

 0
Author: robust12,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-12 20:49:46

Począwszy od Javy 7 możesz użyć try-with-resources Statement

try (BufferedReader br = new BufferedReader(new FileReader(path))) {
    return br.readLine();
}

Ponieważ instancja BufferedReader jest zadeklarowana w instrukcji try-with-resource, zostanie zamknięta niezależnie od tego, czy instrukcja TRY zakończy się normalnie czy nagle. Więc nie musisz zamykać tego samemu w finally oświadczeniu. (Tak jest również w przypadku zagnieżdżonych instrukcji zasobu)

Jest to zalecany sposób pracy z zasobami, Zobacz Dokumentacja aby uzyskać więcej szczegółów informacje

 0
Author: Claudiu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-03 08:12:28