ストリームのためのjavadocは述べている:Files.lines(およびそれに類するストリーム)が自動的に閉じられないのはなぜですか?
ストリームはBaseStream.close()メソッドを持っているとAutoCloseableを実装しますが、ほぼすべてのストリーム・インスタンスは、実際に使用した後に閉じする必要はありません。通常、ソースがIOチャネルであるストリーム(Files.lines(Path、Charset)によって返されるストリームなど)のみを閉じる必要があります。ほとんどのストリームは、特別なリソース管理を必要としないコレクション、配列、または生成関数によってサポートされています。ストリームが終了する必要がある場合、try-with-resourcesステートメントでリソースとして宣言できます。
したがって、ほとんどの場合、ストリームは1つのライナーで使用できますcollection.stream().forEach(System.out::println);
ではなく、Files.lines
およびその他のリソースバックアップストリームについては、try-with-resourcesステートメントを使用するか、リソースをリークする必要があります。
これはエラーが発生しやすく、不要であると私に襲われます。ストリームは一度しか反復することができないので、反復されるとすぐにFiles.lines
の出力を閉じるべきではないという状況はないと考えられます。したがって、実装は、単純に任意の端末の終わりで暗黙的に呼び出す必要があります操作。私は間違っていますか?
私の経験では、ストリームを自動クローズしたくない場合は、ほとんど使用できません。 *あなたのためにすでに閉鎖されたものを再オープンすることはできません。マーク、リセット、シーク実装によっては、同じストリームで複数のデータを複数回読み込むことができます。 – ebyrob
@ebyrobはそのストリームではありません – assylias
単純なtry-with-resourceよりも優れているわけではありませんが、本当に単一の式でそれを行う必要がある場合は、http://stackoverflow.com/a/31179709/2711488 – Holger