2012-11-20 67 views
5

Tôi phải đọc tệp txt trong chương trình của mình. Hiện tại tôi đang sử dụng FileReader và BufferedReader. Tôi đã cố gắng sử dụng Scanner nhưng chậm hơn FileReader và BufferedReader. Có lớp nào có thể đọc tệp nhanh hơn không? Nó phải được viết bằng ngôn ngữ Java.Java, lớp nhanh nhất để đọc từ một tệp txt

tôi cần phải đọc tất cả các từ (dây tách ra bởi khoảng trắng) từ tập tin văn bản

+2

Bạn có bằng chứng cụ thể rằng đọc từ tệp là nút cổ chai trong chương trình của bạn không? Bạn đang làm gì với dữ liệu sau đó và tệp lớn như thế nào? Lưu ý rằng tôi sẽ tự tránh 'FileReader' - sử dụng' InputStreamReader' gói 'FileInputStream', vì vậy bạn có thể thiết lập một cách rõ ràng mã hóa. –

+0

Có thể nút cổ chai của bạn đang tách dòng chứ không phải đọc tệp? Có nhiều cách để tăng tốc String.split(). Từ kinh nghiệm của tôi, BufferedReader rất nhanh. – Serg

+0

Về mặt lý thuyết, java NIO có thể đọc tệp nhanh hơn IO –

Trả lời

1

Nếu các tệp được đọc là rất lớn thì bạn sẽ muốn sử dụng BufferedReader trên đầu trang của FileReader để cải thiện hiệu suất đọc.

hoặc bạn có thể thử một cái gì đó likethis: -

BufferedReader br = new BufferedReader(new FileReader("file.txt")); 
try { 
    StringBuilder sb = new StringBuilder(); 
    String line = br.readLine(); 

    while (line != null) { 
     sb.append(line); 
     sb.append("\n"); 
     line = br.readLine(); 
    } 
    String everything = sb.toString(); 
    } finally { 
    br.close(); 
} 

hoặc bạn có thể thử chương trình này. Nó hoạt động nhanh hơn cho các tệp lớn hơn: -

public String readDoc(File f) { 
String text = ""; 
int read, N = 1024 * 1024; 
char[] buffer = new char[N]; 

try { 
    FileReader fr = new FileReader(f); 
    BufferedReader br = new BufferedReader(fr); 

    while(true) { 
     read = br.read(buffer, 0, N); 
     text += new String(buffer, 0, read); 

     if(read < N) { 
      break; 
     } 
    } 
} catch(Exception ex) { 
    ex.printStackTrace(); 
} 

return text; 
} 
+0

Các tệp mà Im sẽ đọc có thể lớn (hơn 100 MB). Bây giờ, hãy làm như thế này http://pastebin.com/WUaJUT1G Tôi có thể làm nhanh hơn không? Tôi đang làm nó cho dự án trên Đại học và tôi cần phải làm cho tất cả các mảnh của chương trình (đọc, tạo cây và tìm kiếm trong cây) nhanh nhất tôi có thể. – user1736332

+0

Cách tiếp cận này là một cách tiếp cận tốt hơn. Tôi đã kiểm tra nó. –

+0

@ user1736332: - Tôi vừa cập nhật câu trả lời của mình với mã hoạt động nhanh cho các tệp lớn hơn. Vui lòng kiểm tra nó. –

2

Giả sử bạn đọc tất cả các tập tin trong bộ nhớ, nhanh nhất, từ một văn bản quan điểm mã, là:

List<String> lines = Files.readAllLines(yourFile, charset); 

Tôi mong đợi hiệu suất, từ quan điểm thực hiện, để được tốt nếu không tốt hơn (điều này được cho là được tối ưu hóa bởi nhóm đã viết nó).

Sau đó, bạn có thể chia nhỏ hoặc làm bất cứ điều gì bạn cần.

1

Tốc độ đọc và tách là 85 MB/sec. Tôi đã sử dụng tệp 560 MB với 20 cột trong mỗi dòng. Đây là mã:

package csvreader_speedtest; 

import java.io.*; 

public class Csvreader_SpeedTest { 

    final char delimiter = ','; 
    String[] splitted = new String[64]; 

    Csvreader_SpeedTest(String filename) throws Throwable { 
     File file = new File(filename); 
     BufferedReader reader = new BufferedReader(new FileReader(file)); 
     String line; 
     long t0 = System.currentTimeMillis(); 
     while ((line = reader.readLine()) != null) { 
      split(line); 
     } 
     long t1 = System.currentTimeMillis(); 
     reader.close(); 
     System.out.println("read " + file.length() + " bytes in " + (t1 - t0) + " ms"); 
    } 

    private void split(String line) { 
     int idxComma, idxToken = 0, fromIndex = 0; 
     while ((idxComma = line.indexOf(delimiter, fromIndex)) != -1) { 
      splitted[idxToken++] = line.substring(fromIndex, idxComma); 
      fromIndex = idxComma + 1; 
     } 
     splitted[idxToken] = line.substring(fromIndex); 
    } 
} 

đầu ra:

read 561362951 bytes in 6575 ms 

update: nếu tôi sử dụng splitted = line.split(","); thay vì split(line);, tốc độ giảm xuống 32 MB/sec cập nhật 2: mà không cần tách, các tốc độ là 194 MB/sec. Bạn cần nó nhanh đến mức nào?

+0

Tôi cần phải thay thế tất cả các dấu hiệu như /. ,! ? -() [] {}:; "để" không gian trắng và sau đó tách từ flr tất cả các khoảng trắng. Làm thế nào để làm điều đó nhanh chóng? – user1736332

+0

Đây chắc chắn là câu hỏi khác nhau. Để có được câu trả lời đáng tin cậy nhất tôi đề nghị để đăng nó như vậy, ei: "là gì cách nhanh nhất để thay thế tất cả các lần xuất hiện ... trong chuỗi theo không gian? " – Serg

1

Nếu tệp của bạn lớn Files.readAllLines sẽ không hoạt động. Nhưng nếu bạn vẫn muốn thử NIO thật dễ dàng:

FileInputStream fis = new FileInputStream("test.txt"); 
Reader rdr = Channels.newReader(fis.getChannel(), "UTF-8"); 
BufferedReader br = new BufferedReader(rdr); 
... 
Các vấn đề liên quan