2013-10-26 9 views
12

Cách ưa thích và súc tích nhất để in tất cả các dòng trong một tệp bằng cách sử dụng Java 8 mới là gì?Sử dụng Java 8, cách tốt nhất và súc tích nhất để in tất cả các dòng trong một tệp là gì?

Kết quả phải là một bản sao của tập tin, dòng cho dòng như trong:

[Line 1 ...] 
[Line 2 ...] 

Câu hỏi đặt ra liên quan đến Java-8 với lambdas mặc dù có nhiều cách để làm việc đó trong phiên bản cũ. Hiển thị những gì Java-8 là tất cả về!

+0

Bởi vì nhiệm vụ đang được thực hiện trong một chương trình Java. Rõ ràng, nếu bạn đang ở trong MS-DOS hoặc BASH, tệp cat hoạt động. Nhưng bạn biết rằng :) –

Trả lời

27

Điều này sử dụng Luồng mới có lambda trong vùng thử.

tôi sẽ nói đó là cách ưa thích và ngắn gọn nhất vì:

1) Nó sẽ tự động đóng dòng khi thực hiện xong và đúng cách ném bất kỳ trường hợp ngoại lệ.

2) Đầu ra của điều này là lười. Mỗi dòng được đọc sau khi dòng cuối cùng được xử lý. Điều này cũng gần gũi hơn với thông số xử lý tệp gốc dựa trên luồng Java.

3) Nó in từng dòng theo cách gần giống nhất với dữ liệu trong tệp.

4) Đây là ít bộ nhớ chuyên sâu bởi vì nó không tạo ra một danh sách trung gian hoặc mảng như Files.readAllLines (...)

5) Đây là linh hoạt nhất, kể từ khi đối tượng Suối cung cấp có nhiều công dụng khác và các chức năng để làm việc với các dữ liệu (biến đổi, bộ sưu tập, các vị từ, vv)

try (Stream<String> stream = Files.lines(Paths.get("sample.txt"),Charset.defaultCharset())) { 
      stream.forEach(System.out::println); 
} 

Nếu đường dẫn và charset được cung cấp và người tiêu dùng có thể mất bất kỳ đối tượng sau đó làm việc này quá:

try (Stream stream = Files.lines(path,charset)) { 
      stream.forEach(System.out::println); 
} 

Với xử lý lỗi:

try (Stream<String> stream = Files.lines(Paths.get("sample.txt"),Charset.defaultCharset())) { 
      stream.forEach(System.out::println); 
} catch (IOException ex) { 
     // do something with exception 
} 
+1

'CloseableStream' đã bị xóa khỏi các phiên bản Java gần đây 8. Tất cả các luồng là' AutoCloseable', vì vậy chúng vẫn có thể được sử dụng với cấu trúc try-with-resources. Bạn chỉ cần biết những luồng nào thực sự cần được đóng lại. –

+0

Cảm ơn thông tin. Tôi đã thay đổi để chỉ sử dụng Luồng. –

10

Bạn không thực sự cần Java 8:

System.out.println(Files.readAllLines(path, charset)); 

Nếu bạn thực sự muốn sử dụng một dòng hoặc cần một trình bày sạch:

Files.readAllLines(path, charset).forEach(System.out::println); 
+1

Chắc chắn, những công việc đó. Cảm ơn bạn đã hiển thị một số cách thay thế. Tuy nhiên, câu hỏi là cách tốt nhất khi sử dụng Java 8 - không phải là Java 8 được yêu cầu. Bây giờ, câu trả lời của bạn đọc tất cả các dòng đầu tiên và phương pháp Java 8 là lười biếng và có nhiều bộ nhớ an toàn hơn. Hơn nữa, bằng cách sử dụng Files.readAllLines (..) trả về một mảng hoặc danh sách và in nó là xấu xí và không giống như in dòng tệp theo dòng. Vì vậy, để tiếp tục với hành vi ưa thích và truyền thống nhất của việc đọc một tệp, từng dòng và in nó, phương pháp Java 8 có vẻ tốt nhất. –

+4

Đoạn mã thứ hai giải quyết vấn đề in ấn xấu. Đối với sự lười biếng, nó phụ thuộc vào trường hợp sử dụng của bạn - nếu tệp không quá lớn, nó không thực sự cần thiết. YMMV. – assylias

+0

Rất đúng và nếu tôi không phải là hậu môn, tôi sẽ nói phương pháp thứ hai của bạn là dễ nhất để mã. Tôi thực sự thích API Streams mới và nó có một vài tính năng tiện dụng mà Java 8 cung cấp. Vì vậy, tôi cho rằng đó là một tie chặt chẽ :) –

5

Đây là một giải pháp đơn giản:

System.out.println(new String(Files.readAllBytes(Paths.get("sample.java")))); 
+0

Câu trả lời này đã được cung cấp, nhưng đơn giản hơn. – gknicker

+0

Giải pháp này với Nio 2 sử dụng lớp Tệp và phương thức readAllBytes không được cung cấp trong bất kỳ phản hồi trước nào !!! Đã có một sai lầm trong bình luận của bạn, gknicker !! –

+0

'readAllLines' không phải là' readAllFiles' và 'new String()' cũng có thể lấy đối số 'Charset'. –

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