2015-07-01 18 views
11

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()); 
+2

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

Trả lời

8

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úc try-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)

15

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 flatMaplacks 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 ...

Các vấn đề liên quan