Trong mỗi lần thực hiện Java tôi thấy đọc từ một tập tin, tôi hầu như luôn luôn nhìn thấy một trình đọc tập tin được sử dụng để đọc từng dòng. Tôi nghĩ rằng điều này sẽ vô cùng hiệu quả bởi vì nó đòi hỏi một cuộc gọi hệ thống trên mỗi dòng.Java - đọc từ một tệp. Đầu vào dòng vs đầu đọc
Điều tôi đã làm thay vào đó là sử dụng luồng đầu vào và lấy trực tiếp các byte. Trong các thí nghiệm của tôi, điều này nhanh hơn đáng kể. Thử nghiệm của tôi là một tệp 1MB.
//Stream method
try {
Long startTime = new Date().getTime();
InputStream is = new FileInputStream("test");
byte[] b = new byte[is.available()];
is.read(b);
String text = new String(b);
//System.out.println(text);
Long endTime = new Date().getTime();
System.out.println("Text length: " + text.length() + ", Total time: " + (endTime - startTime));
}
catch (Exception e) {
e.printStackTrace();
}
//Reader method
try {
Long startTime = new Date().getTime();
BufferedReader br = new BufferedReader(new FileReader("test"));
String line = null;
StringBuilder sb = new StringBuilder();
while ((line = br.readLine()) != null) {
sb.append(line);
sb.append("\n");
}
String text = sb.toString();
Long endTime = new Date().getTime();
System.out.println("Text length: " + text.length() + ", Total time: " + (endTime - startTime));
}
catch (Exception e) {
e.printStackTrace();
}
này đưa ra một kết quả của:
Text length: 1054631, Total time: 9
Text length: 1034099, Total time: 22
Vì vậy, tại sao mọi người sử dụng độc giả thay vì suối?
Nếu tôi có phương thức lấy tệp văn bản và trả về một Chuỗi chứa tất cả văn bản, có nhất thiết phải làm điều đó bằng cách sử dụng luồng không?
Mã của bạn không chính xác. Nó không đảm bảo rằng nó sẽ đọc toàn bộ tập tin, xem tài liệu của các phương pháp đọc và sẵn có. – Milo
Bạn đã thử dùng [java.nio.File] (http://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html) Files.readAllLines của gói (.. .) phương pháp. –
+1 để tìm hiểu điều gì đó mới – panny