Quoth the Javadoc :
Strumienie mają metodę BaseStream.close () i implementują funkcję AutoCloseable, ale prawie wszystkie instancje strumienia nie muszą być tak naprawdę zamykane po użyciu. Zasadniczo tylko strumienie, których źródłem jest kanał IO (takie jak te zwracane przez Files.lines (Path, Charset)) będą wymagać zamknięcia. Większość strumieni jest wspierana przez kolekcje, tablice lub funkcje generujące, które nie wymagają specjalnego zarządzania zasobami. (Jeśli strumień wymaga zamknięcia, można go zadeklarować jako zasób w instrukcji try-with-resources).
„Prawie wszystkie” i „ogólnie” są niejasne - jeśli piszesz bibliotekę i oddzielasz źródło swojego strumienia od użytkowników tego strumienia, zawsze musisz zadać sobie pytanie - „powinienem zamknąć to?" Strumienie wspierane przez IO muszą zostać zamknięte, ponieważ operacje terminali nie wywołują close
, dlatego zawsze muszę pamiętać / dokumentować, skąd pochodzi mój strumień, lub zawsze muszę to robić close
.
Chyba nuklearną opcją byłoby nie zwracanie strumieni z metod lub akceptowanie parametrów strumienia, co jest sentymentem, który został powtórzony przez niektóre osoby z zespołu JDK. Uważam, że jest to zbyt ograniczające, biorąc pod uwagę praktyczną przydatność strumieni.
Jakie są najlepsze praktyki dotyczące zamykania strumieni? Szukałem w Internecie odpowiedzi na to pytanie od niektórych osób z JDK, które zwykle są aktywne w podobnych pytaniach społeczności, ale nie znalazłem nic istotnego.