我是java新手我制作了一个简单的应用程序(工具),它从文本文件中获取单词列表,然后对于每个单词,它应该在字典中查找其含义,应用程序可以使用英语单词并查找其含义在阿拉伯语词典中,反之亦然,代码中的每一件事都很好,但问题是在阅读文本文件时需要花费很长时间才能阅读它...文本文件包含超过3000行,每行可能有10行或者更多的话。读取文件的方法如下:
public static void ChooseFile() throws IOException {
new Thread(new Runnable() {
public void run()
{
try {
int h = 0 ;
int b =0 ;
chooser = new JFileChooser();
chooser.setCurrentDirectory(new java.io.File("."));
chooser.setDialogTitle(choosertitle);
chooser.setMultiSelectionEnabled(true);
if (chooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
System.out.println("getCurrentDirectory(): "
+ chooser.getCurrentDirectory());
System.out.println("getSelectedFile() : "
+ chooser.getSelectedFile());
} else {
System.out.println("No Selection ");
}
FileReader reader = new FileReader(chooser.getSelectedFile());
BufferedReader bufferedReader = new BufferedReader(reader);
//progressBar.setIndeterminate(true);
while ((line = bufferedReader.readLine().replaceAll("\\s+", "\r\n")) != null) {
line.replaceAll("\\p{Punct}", "");
String g;
//g = g.replace("\\s+", "/n");
Scanner inFile1 = new Scanner(line.replaceAll("\\p{Punct}","").replaceAll("\\p{Digit}",""));
while (inFile1.hasNext()) {
// find next line
g = inFile1.next();
lines.add(g);
progressBar.setVisible(true);
progressBar.setIndeterminate(true);
h++ ;
ResultField.setText(lines.toString());
ResultField.validate();
}
// lines.add(line);
System.out.println(lines);
}
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}}).start();
} // End of choose file .
我已编辑代码: public static void ChooseFile()抛出IOException {
new Thread(new Runnable() {
public void run()
{
try {
int h = 0 ;
int b =0 ;
chooser = new JFileChooser();
chooser.setCurrentDirectory(new java.io.File("."));
chooser.setDialogTitle(choosertitle);
chooser.setMultiSelectionEnabled(true);
if (chooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
System.out.println("getCurrentDirectory(): "
+ chooser.getCurrentDirectory());
System.out.println("getSelectedFile() : "
+ chooser.getSelectedFile());
} else {
System.out.println("No Selection ");
}
FileReader reader = new FileReader(chooser.getSelectedFile());
BufferedReader bufferedReader = new BufferedReader(reader);
//progressBar.setIndeterminate(true);
while ((line = bufferedReader.readLine()) != null) {
String g;
//g = g.replace("\\s+", "/n");
Scanner inFile1 = new Scanner(line.replaceAll("\\p{Punct}","").replaceAll("\\p{Digit}",""));
while (inFile1.hasNext()) {
// find next line
g = inFile1.next();
lines.add(g);
// progressBar.setVisible(true);
// progressBar.setIndeterminate(true);
h++ ;
// ResultField.setText(lines.toString());
// ResultField.validate();
}
// lines.add(line);
System.out.println(lines);
}
reader.close();
//progressBar.setIndeterminate(false);
ResultField.setText(lines.toString());
ResultField.validate();
} catch (IOException e) {
e.printStackTrace();
}
}}).start();
} // End of choose file .
它仍然需要时间,但现在它要快很多,谢谢..
答案 0 :(得分:2)
不断更新GUI可能会很慢。我真的想要一个中间结果。多线程,因此实际读数不会受到阻碍(同样多)。否则,将其移至循环的末尾。
此外,您使用此.replaceAll("\\s+", "\r\n"))
将所有空格替换为新行,然后迭代每个新行。你最好用line.split(...)
由于在.replaceAll("\\p{Punct}","").replaceAll("\\p{Digit}","")
中您同时删除了这些字符,因此只需调用一次replaceAll即可。
答案 1 :(得分:1)
来电ResultField.setText(lines.toString())
和ResultField.validate()
最有可能需要很长时间。您每次处理一个单词时都会调用它们。对于具有3000行和10个单词的文件,该行为30000次。我没有看到你想要在循环中调用它们的原因。将这些调用移到循环后执行。