所以我有一个能够读取csv文件的工作代码,但由于文件非常大,所以在textarea中瞬间显示所有数据之前,大约需要两分钟才能读取。我正在使用windowsbuilder在eclipse中使用GUI界面。以下是代码;
JButton btnopen = new JButton("Open");
btnopen.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
try{
final JFileChooser fc = new JFileChooser(); //launching the file chooser
fc.setFileFilter(new FileNameExtensionFilter("Text Files", "txt")); //this will allow text files to be read
fc.setFileFilter(new FileNameExtensionFilter("CSV", "csv")); //this will allow csv files to be read
fc.setFileFilter(new FileNameExtensionFilter("JSON", "json")); //this will allow json files to be read
fc.setFileFilter(new FileNameExtensionFilter("XML", "xml")); //this will allow xml files to be read
int returnVal = fc.showOpenDialog(contentPane);
File f; //file that holds the data from the text file
fc.removeChoosableFileFilter(fc.getAcceptAllFileFilter());
if(returnVal == JFileChooser.APPROVE_OPTION) {
f = fc.getSelectedFile(); //tells file chooser to get the file selected and store into file variable
String output="";
//use buffered reader and file reader to read selected file
BufferedReader in = new BufferedReader(new FileReader(f));
//after reading data, store in to string
String line = in.readLine(); //every time a line is read, data is put into text area
int i=0;
while(line!=null){ //while still reading...
//
line = in.readLine(); //continue reading next line of file
output +=line+"\n";
//textArea.append(line +"\n"); //add text from file into text area
//++i;
}
textArea.append(output);
}
}
catch(Exception e){
}
}
});
答案 0 :(得分:0)
使用StringBuilder创建字符串。因为字符串是不可变的,所以每次使用“+”附加内容时都会创建一个新对象。
这将提高性能,但可能不是主要问题。
文件系统访问速度很慢。也许尝试一次读取您的文件并将其保存在内存中(在列表或其他内容中)。或者只尝试一次显示文件的一部分(分页)。
BufferedReader in = new BufferedReader(new FileReader(f));
StringBuilder builder = new StringBuilder();
String line = "";
while((line = in.readLine()) != null){
builder.append(line);
builder.append("\n");
}
textArea.append(builder.toString());
答案 1 :(得分:0)
@HectorLector的回复会稍微优化读数,但它们是正确的;最后,阅读文件需要花费很长时间。我怀疑你的基本问题可能是“我在阅读这个文件时如何让我的UI响应?” - 现在,由于您正在ActionListener
内进行阅读,因此在读取文件时您的UI将被完全阻止,这会导致糟糕的用户体验。
答案是文件系统访问等长时间运行应该在后台线程上完成。考虑使用SwingWorker
(see the tutorial)来执行此类任务;工作线程可以构建字符串并使用done()
方法更新文本区域(或者,如果要在读取文件时显示该文件,请使用publish()
和{{1的组合方法)。
另外,作为附注,请确保您process()
正在使用close()
来阅读该文件。将阅读本身包裹在BufferedReader
块中,并在try
内关闭,以防在阅读过程中出现任何问题。像这样:
finally