1

我正在使用以下方法将文件读入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");
     }
   }
}

它适用于正常大小的文件(几百 KB),但是当我测试一个 42 MB 的 30000 行文件时,记事本可以在大约 5 秒内打开它,我的文件阅读器却花了很长时间。我等不及要完成了。我等了大约 15-20 分钟,它仍在工作,消耗了我 30% 的 CPU 使用率。

你能给我一个解决方案吗?我只处理文本文件,而不是二进制文件,我所知道的是BufferedReader最好的。

4

1 回答 1

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

正如评论中所建议的,您可能希望在新线程中执行此操作,这样用户就不会认为您的程序已冻结。

于 2013-03-31T16:54:31.517 回答