2012-11-20 82 views
5

我必須在我的程序中讀取txt文件。我目前正在使用FileReader和BufferedReader。我試圖使用掃描儀,但比FileReader和BufferedReader慢。有什麼課程可以更快地讀取文件嗎?它必須用Java語言編寫。Java,從txt文件中讀取速度最快的課程

我需要閱讀從文本文件

+2

你有沒有具體的證據表明從文件中讀取是程序中的瓶頸?之後你對數據做了什麼,文件有多大?請注意,我會避免'FileReader'自己 - 使用'InputStreamReader'封裝'FileInputStream',所以你可以明確地設置編碼。 –

+0

也許你的瓶頸是分裂線而不是閱讀文件?有許多方法可以加速String.split()。根據我的經驗,BufferedReader速度非常快。 – Serg

+0

理論上,Java NIO可以以比IO更快的速度讀取文件 –

回答

1

如果正在讀取的文件很大,那麼您應該在FileReader的頂部使用BufferedReader以提高讀取性能。

或者,你可以嘗試的東西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(); 
} 

,或者你可以試試這個程序。對於較大的文件,它工作得更快: -

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

我要讀取的文件可能很大(大於100 MB)。 現在即時通訊這樣那樣的 http://pastebin.com/WUaJUT1G 我可以做得更快? 我正在爲大學項目做這件事,我需要以最快的速度製作所有片段(閱讀,創建樹和在樹中搜索)。 – user1736332

+0

這種方法是一種更好的方法。我已經檢查過了。 –

+0

@ user1736332: - 我剛剛更新了我的答案,其中包含適用於較大文件的快速代碼。請檢查它。 –

2

(用空格splited字符串)的所有單詞假設你讀內存,最快的所有文件,從代碼編寫的角度來看,就是:

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

從執行的角度來看,我認爲性能如果不是更好(這應該是由編寫它的團隊優化的)。

然後,您可以拆分或做任何你需要的。

1

讀取和拆分的速度爲85 MB/sec。 我使用了560 MB文件,每行有20列。 下面是代碼:

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); 
    } 
} 

輸出:

read 561362951 bytes in 6575 ms 

更新: 如果我使用的splitted = line.split(",");代替split(line);,速度下降到32 MB/sec 更新2:而不破,則速度爲194 MB/sec。你需要多快?

+0

我需要替換/ /等所有符號。 ,! ? - ()[] {}:; ''到''(空格),然後將所有空格分隔開來,如何做到這一點呢? – user1736332

+0

這是完全不同的問題,爲了得到最可靠的答案,我建議把它貼出來,ei:「什麼是用空格替換字符串中所有外觀的最快方法?「 – Serg

1

如果你的文件很大Files.readAllLines將不起作用。但是如果你仍然想嘗試NIO,很簡單:

FileInputStream fis = new FileInputStream("test.txt"); 
Reader rdr = Channels.newReader(fis.getChannel(), "UTF-8"); 
BufferedReader br = new BufferedReader(rdr); 
...