资源里有主要两个东西:1.自己编写的MyCurveManagementSystem.java,可以载入文本文件。载入小文本文件没有问题,但是载入较大(90MB)的文本文件,界面就会失去响应(用户名、密码:admin,admin)可是自己明明使用了EventQueue.invokeLater这个方法来处理读取文件和更新TextArea操作2.SwingWorkerTest.java,core java上的示例,载入大文本文件完全无压力3.还有一个问题,双击我的MyCurveManagementSystem标题栏,为什么窗口缩成一点点。
http://download.csdn.net/detail/zhrubin/5497013
http://download.csdn.net/detail/zhrubin/5497013
还试过把读入文本的操作,new Thread start,还是有问题
ManagementFrame.this.remove(curvePanel);
ManagementFrame.this.add(filePanel,BorderLayout.CENTER);
ManagementFrame.this.validate();
int result = fileChooser.showOpenDialog(ManagementFrame.this);
if(result == JFileChooser.APPROVE_OPTION){
final String name = fileChooser.getSelectedFile().getPath();
final File file = fileChooser.getSelectedFile();
ManagementFrame.this.setTitle("打开文件"+name);
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
//该方法有更新GUI的语句,应放到事件分配进程
//但是该程序缺点很明显,打开大文件(90MB)的时候,界面失去响应
//更好的改进,请参见jdk中的SwingWorker类的使用
loadFileToTextArea(file, textArea);
} catch (FileNotFoundException e) {
ManagementFrame.this.statusLine.setText("找不到"+name+"文件");
e.printStackTrace();
} catch (IOException e) {
ManagementFrame.this.statusLine.setText("读取文件"+name+"错误");
e.printStackTrace();
}
}
});
System.out.println("end");
}
}
private void loadFileToTextArea(File file, JTextArea textArea) throws IOException,FileNotFoundException{
StringBuilder sb = new StringBuilder();
InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream(file), "GBK");
BufferedReader br = new BufferedReader(inputStreamReader);
String s;
String separator = System.getProperty("line.separator");
while( (s = br.readLine()) != null ) {
sb.append(s).append(separator);
}
textArea.setText(sb.toString());
}
想想你的代码载入有什么问题。
SwingWorker那个例子中
public StringBuilder doInBackground() throws IOException, InterruptedException
{
int lineNumber = 0;
Scanner in = new Scanner(new FileInputStream(file));
while (in.hasNextLine())
{
String line = in.nextLine();
lineNumber++;
text.append(line);
text.append("\n");
ProgressData data = new ProgressData();
data.number = lineNumber;
data.line = line;
publish(data);
Thread.sleep(1); // to test cancellation; no need to do this in your programs
}
return text; @Override
public void done()
{
try
{
StringBuilder result = get();
textArea.setText(result.toString());
statusLine.setText("Done");
}
其中text是一个StringBuilder,也是采用的这种策略,但并没有死掉
而且我试过读一行更新一次textArea这个策略也不行
900MB必然采取分段读取、部分加载的策略
次要原因,loadFileToTextArea耗时较久(其实也不久),不应该将这个方法放入事件分配线程
主要原因,那个90MB文件太大,有上千万行,如果对整个进行更新的话,必然挂掉。而Core java中的
SwingWorker那个例子,我研究了一下,是读一行,调用事件分配线程更新一下GUI,所以没问题改进设想:
loadFileToTextArea放到一个工作线程中,在这个工作线程想办法每读一行,就把读取的数据通知
到更新界面的事件分配线程。如何通知?这涉及到了工作线程和事件分配线程对共享资源的访问,或许采用
阻塞队列是一个好办法。当然直接使用SwingWorker这个java类库也行,人家类库已经把这些东西考虑好了。看来学习多线程,还有很长的路要走。hoho
publish(data);
就是通知事件分配线程负责更新GUI
以前没理解,现在才知道