CSV文件阅读器在窗口构建器中占用太长时间

时间:2013-12-22 20:49:40

标签: java eclipse csv windowbuilder

所以我有一个能够读取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){

        }

        }           
    });

2 个答案:

答案 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将被完全阻止,这会导致糟糕的用户体验。

答案是文件系统访问等长时间运行应该在后台线程上完成。考虑使用SwingWorkersee the tutorial)来执行此类任务;工作线程可以构建字符串并使用done()方法更新文本区域(或者,如果要在读取文件时显示该文件,请使用publish()和{{1的组合方法)。

另外,作为附注,请确保您process()正在使用close()来阅读该文件。将阅读本身包裹在BufferedReader块中,并在try内关闭,以防在阅读过程中出现任何问题。像这样:

finally