我正在使用以下方法将文件读入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
是最好的。
答案 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());
}
正如评论中所建议的那样,您可能希望在新主题中执行此操作,以便用户不认为您的程序已冻结。