Normalnie jest ok po prostu zamknąć najbardziej zewnętrzną strumienia, ponieważ zgodnie z przyjętą konwencją musi wyzwalać blisko na strumieniach bazowych.
Więc normalnie kod wygląda następująco:
BufferedReader in = null;
try {
in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
...
in.close(); // when you care about Exception-Handling in case when closing fails
}
finally {
IOUtils.closeQuietly(in); // ensure closing; Apache Commons IO
}
jednak nie mogą być rzadkie przypadki, w których strumień bazowy konstruktor zgłasza wyjątek, jeśli strumień jest już otwarty. W takim przypadku powyższy kod nie zamknie strumienia bazowego, ponieważ zewnętrzny konstruktor nigdy nie został wywołany, a in
ma wartość null. Tak więc blok finally nie zamyka niczego pozostawiając otwarty strumień bazowy.
Ponieważ Java 7 można to zrobić:
try (OutputStream out1 = new ...; OutputStream out2 = new ...) {
...
out1.close(); //if you want Exceptions-Handling; otherwise skip this
out2.close(); //if you want Exceptions-Handling; otherwise skip this
} // out1 and out2 are auto-closed when leaving this block
W większości przypadków nie chcesz obsługi wyjątków, gdy podniesiona podczas zamykania więc pominąć te wyraźny Close() zwraca.
Edytuj Oto kod dla niewierzących, w przypadku gdy użycie tego wzoru jest zasadne. Możesz także przeczytać Apache Commons IOUtils javadoc o metodzie closeQuietly().
OutputStream out1 = null;
OutputStream out2 = null;
try {
out1 = new ...;
out2 = new ...;
...
out1.close(); // can be skipped if we do not care about exception-handling while closing
out2.close(); // can be skipped if we ...
}
finally {
/*
* I've some custom methods in my projects overloading these
* closeQuietly() methods with a 2nd param taking a logger instance,
* because usually I do not want to react on Exceptions during close
* but want to see it in the logs when it happened.
*/
IOUtils.closeQuietly(out1);
IOUtils.closeQuietly(out2);
}
Korzystanie @ Toma „porady” pozostawi out1
otwarty, gdy stworzenie out2
podnosi wyjątek. Ta rada pochodzi od kogoś, kto mówi o It's a continual source of errors for obvious reasons.
Cóż, mogę być ślepy, ale nie jest to dla mnie oczywiste. Mój wzorzec jest bezpieczny dla idioty w każdym przypadku użycia, jaki mogę sobie wyobrazić, podczas gdy wzorzec Toma jest podatny na błędy.
Możliwy duplikat [Czy muszę zamknąć() zarówno FileReader, jak i BufferedReader?] (Http://stackoverflow.com/questions/1388602/do-i-need-to-close-both-filereader-and-bufferedreader) – River