Java 为什么我读取文本文件的方法花费的时间太长

Java 为什么我读取文本文件的方法花费的时间太长,java,maven,Java,Maven,我是java新手我制作了一个简单的应用程序(工具),从文本文件中获取单词列表,然后每个单词都应该在字典中查找其含义,该应用程序可以获取英语单词并在阿拉伯语字典中查找其含义,反之亦然,代码中的每件事都很好,但问题是,当读取文本文件时,它需要很长的时间,比如几个小时。。文本文件包含3000多行,每行可能包含10个或更多单词。读取文件的方法如下所示: public static void ChooseFile() throws IOException { new Thread(new Run

我是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  .
我已将代码编辑为: 公共静态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  . 

这仍然需要时间,但现在速度要快得多。非常感谢。

不断更新GUI可能会很慢。我想你真的需要一个中间结果。对其进行多线程处理,这样实际读取就不会受到阻碍(那么多)。否则,将其移动到循环的末尾

此外,您还可以使用此
.replaceAll(“\\s+”,“\r\n”)
将所有空格替换为新行,然后迭代每一新行。最好使用
行.split(…)


由于在
.replaceAll(“\\p{Punct},”).replaceAll(“\\p{Digit},”)
中,两次都删除这些字符,只需调用一次replaceAll就可以了。

不断更新GUI可能会很慢。我想知道,您真的想要一个中间结果。多线程处理它,这样实际读取就不会受到(同样多)阻碍。否则,请将其移动到循环的末尾

此外,您还可以使用此
.replaceAll(“\\s+”,“\r\n”)
将所有空格替换为新行,然后迭代每一新行。最好使用
行.split(…)


由于在
.replaceAll(“\\p{Punct},”).replaceAll(“\\p{Digit},”)
中删除这两个字符,只需调用一次replaceAll即可。调用
ResultField.setText(lines.toString())
ResultField.validate()最有可能花很长时间。每次处理一个字时,都会调用它们。对于一个有3000行和10行的文件,一行是30000次。我看不出为什么要在中间调用它们。把那些调用在循环之后执行。

调用<代码>结果字段。(lines.toString())
ResultField.validate()最有可能花很长时间。每次处理一个字时,都会调用它们。对于一个有3000行和10个单词的文件,一行是30000次。我看不出为什么要在中间调用它们。把那些调用在循环之后执行。

难道你没有得到<代码> Null PoExtExealOuts<代码>吗?
(line=bufferedReader.readLine().replaceAll(“\\s+”,“\r\n”)!=null)
当到达
EOF
.hmm.时,这行应该抛出
NPE
它。事实上,没有,从来没有发生过@Sanket MakaniTry在调试模式下运行代码,并使用断点查找导致问题的行。因为你没有得到NPE,我怀疑你的循环有问题。@AbdulazizAbdulah你错了。这是绝对正确的当您到达文件末尾时,您不可能不使用此代码获取
NullPointerException
。您需要先检查
readLine()
的结果是否为null,然后再对其执行任何其他操作,例如调用
replaceAll()
replaceAll()也不可能
返回null。您的代码没有意义。使用
BufferedReader.readLine()
line.replaceAll()每秒可以读取数百万行
什么也不做,因为结果没有分配。请尝试调试您的代码。@EJP您是对的,它确实显示了NullPointerException,我想不是,因为它花费了太长时间,导致我停止程序,然后手动减少文本文件。一个电枢移动,但我至少在不停止进程的情况下解决了问题。我怎么看e现在修改了它,希望现在更好。新行是:while((line=bufferedReader.readLine())!=null)。感谢大家的响应。您没有得到
NullPointerException
(line=bufferedReader.readLine().replaceAll(“\\s+”,“\r\n”))!=null)
当到达
EOF
时,此行应该抛出
NPE
它。嗯..实际上没有,从来没有发生过@Sanket MakaniTry在调试模式下运行代码,并使用断点查找导致问题的行。由于您没有得到NPE,我怀疑您的循环有问题。@AbdulazizAbdulah您错了。这是错误的当您到达文件末尾时,绝对不可能不使用此代码获取
NullPointerException
。您需要先检查
readLine()
的结果是否为null,然后再对其执行任何其他操作,例如调用
replaceAll()
replaceAll()也不可能
返回null。您的代码没有意义。使用
BufferedReader.readLine()
line.replaceAll()每秒可以读取数百万行
什么也不做,因为结果没有分配。请尝试调试您的代码。@EJP您是对的,它确实显示了NullPointerException,我想不是,因为它花费了太长时间,导致我停止程序,然后手动减少文本文件。一个电枢移动,但我至少在不停止进程的情况下解决了问题。我怎么看e现在修改了它,希望现在更好。新行是:while((line=bufferedReader.readLine())!=null)。谢谢大家的回复。确切地说,我已经删除了重复的GUI更新,现在速度更快了。。谢谢实际上我已经删除了重复的GUI更新,现在速度更快了。。谢谢。我想让它实时显示文件,但结果不是一个好方法。我应该找到更好的方法。。还在学习。我想让它显示文件但事实证明这不是一个好方法。我应该找到一个更好的方法。还在学习。