在java中读取大文本文件,不可行?

时间:2013-03-31 16:51:07

标签: java file-io

我正在使用以下方法将文件读入JTextArea

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

正常大小的文件(几百千字节)可以正常工作,但是当我测试一个4200 MB的30000行文件时,Notepad可以在大约5秒钟内打开,我的文件阅读器永远占用了。我等不及它完成;我已经等了大约15-20分钟,它仍在工作,消耗了30%的CPU使用率。

你能帮我解决一个问题吗?我只处理文本文件,而不是二进制文件,而我所知道的只使用BufferedReader是最好的。

1 个答案:

答案 0 :(得分: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());
}

正如评论中所建议的那样,您可能希望在新主题中执行此操作,以便用户不认为您的程序已冻结。