Mã dưới đây có cần được bao bọc trong các tài nguyên thử để đảm bảo tệp cơ bản được đóng không?Có thu thập hoạt động trên Luồng đóng luồng và tài nguyên cơ bản không?
List<String> rows = Files.lines(inputFilePath).collect(Collectors.toList());
Mã dưới đây có cần được bao bọc trong các tài nguyên thử để đảm bảo tệp cơ bản được đóng không?Có thu thập hoạt động trên Luồng đóng luồng và tài nguyên cơ bản không?
List<String> rows = Files.lines(inputFilePath).collect(Collectors.toList());
Khi javadoc của quá tải Files#lines(Path, Charset)
phương pháp khẳng định
Các dòng trở lại gói gọn một
Reader
. Nếu cần xử lý kịp thời tệp tài nguyên hệ thống , thì cấu trúctry-with-resources
phải được sử dụng để đảm bảo rằng phương thức đóng của luồng được gọi sau khi hoàn tất các hoạt động luồng .
Vì vậy, hãy đính kèm theo số Stream
trong câu hỏi try-with-resources
. (. Hoặc close nó một cách thích hợp)
Có một trick để làm cho việc thực hiện Stream
gọi close()
sau ca phẫu thuật đầu cuối:
List<String> rows = Stream.of(Files.lines(inputFilePath)).flatMap(s->s)
.collect(Collectors.toList());
Nó chỉ đơn giản tạo ra một dòng suối đóng gói dòng dòng như một mục duy nhất và sử dụng flatMap
với chức năng nhận dạng (Function.identity()
cũng sẽ hoạt động) để biến nó thành một dòng các dòng một lần nữa.
Điểm thú vị là một property of Stream.flatMap(…)
:
Mỗi dòng ánh xạ được đóng sau khi nội dung của nó đã được đặt vào dòng này.
Vì vậy, mã ở trên sẽ đóng luồng các dòng. Mặc dù nó ngắn gọn hơn nhưng nó có nhược điểm hơn khi thử với các tài nguyên hiện tại đang thực hiện flatMap
lacks lazy evaluation không có liên quan ở đây vì bạn đang thu thập tất cả các dòng vào danh sách. Nhưng đó là điều cần lưu ý khi sử dụng mẹo này trong các trường hợp khác.
Đối với mã của câu hỏi như-là có một giải pháp thậm chí đơn giản hơn:
List<String> rows = Files.readAllLines(inputFilePath);
Đọc tất cả các dòng và đóng tất cả các nguồn lực ...
Thiết kế của Stream và close() là rất gây tranh cãi . Để an toàn, hãy luôn luôn đóng Luồng nếu bạn không chắc chắn. Và thậm chí điều đó có thể không đủ, hãy xem http://stackoverflow.com/questions/20319417/why-is-bufferedreader-not-closed-when-obtaining-streamstring-in-try-with-res – ZhongYu