Od the docs:Czy zamknięcie strumienia zamyka źródło BufferedReader?
Strumienie mają metodę BaseStream.close() i wdrożyć AutoCloseable, ale prawie wszystkie przypadki strumień rzeczywistości nie muszą być zamknięte po użyciu. Zasadniczo, tylko strumienie, których źródłem jest kanał IO (takie jak , jak te zwrócone przez Files.lines (Path, Charset)) będą wymagały zamknięcia. Większość strumieni jest obsługiwana przez kolekcje, tablice lub generujące funkcje , które nie wymagają specjalnego zarządzania zasobami. (Jeśli strumień wymaga zamknięcia, nie może być uznana jako zasób w try-with-zasobów oświadczeniu.)
Kiedy tworzę Stream<String>
stosując metodę lines()
na BufferedReader
jak widać poniżej, nie zamknięcie Stream
również zamknąć BufferedReader
?
try (Stream<String> lines = new BufferedReader(new InputStreamReader(process.getInputStream())).lines()) {
// Do stuff
}
// Is the BufferedReader, InputStreamReader and InputStream closed?
Niektóre naprawdę szybkie testy próbowałem powiedzieć nie (pole z BufferedReader
in
nie jest null
), ale jestem zdezorientowany przez następnym zdaniu, ponieważ to przykładem jest I/O jak dobrze, dobrze?
Ogólnie, tylko strumienie, których źródłem jest kanał IO (takiego jak te zwrócony przez Files.lines (Ścieżka Charset)) wymaga zamknięcia.
Jeśli nie, muszę zamknąć zarówno instancji, albo zamykając BufferedReader
wystarczą?
Idealnie, chciałbym zwrócić Stream<String>
z jakiejś metody, bez konieczności martwić klienta o czytelników. W tej chwili stworzyłem dekorator Stream
, który również zamyka czytnik, ale jest to łatwiejsze, jeśli nie jest to konieczne.
Gdzie można sprawdzić, że ' BufferedReader' jest zamknięty? Wewnątrz bloku 'try'? –
Przetestowałem go po jawnym wywołaniu 'close' w' Stream' i sprawdzeniu pola za pomocą debuggera. Próba automatycznego doboru jest przykładem tego, jak chciałbym go użyć. – nhaarman
Zobacz też: http://stackoverflow.com/questions/34072035/why-is-files-lines-and-similar-streams-not-automatically-closed/34073306#34073306 –