为什么我的方法读取文本文件需要太长时间

时间:2017-05-29 10:02:13

标签: java maven

我是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  . 

它仍然需要时间,但现在它要快很多,谢谢..

2 个答案:

答案 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次。我没有看到你想要在循环中调用它们的原因。将这些调用移到循环后执行。