| The problem is described in the [javadoc] for `Files`. |
| |
| ## `Files.newDirectoryStream` |
| |
| > When not using the try-with-resources construct, then directory stream's close |
| > method should be invoked after iteration is completed so as to free any |
| > resources held for the open directory. |
| |
| ## `Files.list` |
| |
| > The returned stream encapsulates a `DirectoryStream`. If timely disposal of |
| > file system resources is required, the try-with-resources construct should be |
| > used to ensure that the stream's close method is invoked after the stream |
| > operations are completed. |
| |
| ## `Files.walk` |
| |
| > The returned stream encapsulates one or more `DirectoryStreams`. If timely |
| > disposal of file system resources is required, the try-with-resources |
| > construct should be used to ensure that the stream's close method is invoked |
| > after the stream operations are completed. Operating on a closed stream will |
| > result in an `IllegalStateException`. |
| |
| ## `Files.find` |
| |
| > The returned stream encapsulates one or more `DirectoryStreams`. If timely |
| > disposal of file system resources is required, the try-with-resources |
| > construct should be used to ensure that the stream's close method is invoked |
| > after the stream operations are completed. Operating on a closed stream will |
| > result in an `IllegalStateException`. |
| |
| ## `Files.lines` |
| |
| > The returned stream encapsulates a `Reader`. If timely disposal of file system |
| > resources is required, the try-with-resources construct should be used to |
| > ensure that the stream's close method is invoked after the stream operations |
| > are completed. |
| |
| [javadoc]: https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html |
| |
| ## The solution |
| |
| To ensure the stream is closed, always use try-with-resources. For example, when |
| using `Files.lines`, do this: |
| |
| ```java |
| String input; |
| try (Stream<String> stream = Files.lines(path)) { |
| input = stream.collect(Collectors.joining(", ")); |
| } |
| ``` |
| |
| Not this: |
| |
| ```java |
| // the Reader is never closed! |
| String input = Files.lines(path).collect(Collectors.joining(", "); |
| ``` |
| |
| ## What about methods that return closeable streams? {#must-be-closed} |
| |
| Methods that return `Stream`s that encapsulate a closeable resource can be |
| annotated with `com.google.errorprone.annotations.MustBeClosed` to ensure their |
| callers remember to close the stream. |