2013-03-31 50 views
1

我使用下面的方法來讀取文件轉換成JTextArea在java中讀取大文本文件,不可行?

public void readFile(File file) throws java.io.FileNotFoundException, 
             java.io.IOException { 
    if(file == null) return; 
    jTextArea1.setText(""); 
    try(BufferedReader reader = new BufferedReader(new FileReader(file))){ 
    String line = ""; 
    while((line=reader.readLine())!=null){ 
     jTextArea.append(line + "\n"); 
    } 
    } 
} 

它的工作原理與確定一個正常大小的文件(幾百千字節),但是當我測試的30000行的文件記事本可以在大約5秒內打開42 MB,我的文件讀取器將永久佔用。我等不及它完成;我已經等了大約15-20分鐘,它仍然在工作,消耗了30%的CPU使用量。

您能否給我一個解決方案?我只處理文本文件,而不是二進制文件,而我所知道的全部使用BufferedReader是最好的。

+0

NIO的文件處理的API將在這裏更適合 –

+0

如果你想真正快速讀/寫一下【JAVA NIO包] [1] [1]:http://stackoverflow.com/ questions/3599711/understanding-java-nio-concepts – Seky

回答

3

該問題可能不在文件讀取中,而是在處理中。對大型數據集重複調用append可能效率非常低。可以考慮使用StringBuilder。此類專爲快速從部件創建長字符串而設計(在單線程上;請參見StringBuffer以獲取多線程對應部分)。

if(file == null) return; 
StringBuilder sb = new StringBuilder(); 
jTextArea1.setText(""); 
try(BufferedReader reader = new BufferedReader(new FileReader(file))){ 
    String line = ""; 
    while((line==reader.readLine())!=null){ 
     sb.append(line); 
     sb.append('\n'); 
    } 
    jTextArea1.setText(sb.toString()); 
} 

正如評論所說,你不妨在一個新的線程執行此操作,因此用戶並不認爲你的程序已經凍結。

+0

我不知道文本區域組件處理海量數據的能力如何...... – bdares

+0

如果您希望處理這些大文件,您可能需要考慮以下內容。移動'讀取文件並將'JTextArea'邏輯填充到一個單獨的線程中。您的用戶界面可能會顯示文字,如「正在加載文件時請稍候」,通知用戶正在執行某些操作,儘管他們看不到結果。 – mthmulders

+0

@bdares這是另一個問題,是的,但我不知道有任何補救措施。 – wchargin