使用java快速有效地读取制表符分隔文件的方法

时间:2011-12-13 05:56:01

标签: java performance file

将文本文件读入数组列表的最有效方法(就时间而言)是什么。文件大小为100 mb到2 gb。该文件包含以下格式化的数据:

From      TO          time     

a         b      13 decc 2009
b         c      13 decc 2009
c         d      13 decc 2009
f         h      13 decc 2009
f         g      13 decc 2009

修改 以下是读取文件的代码

public List<InputDataBean> readInputData() throws Exception{
        List<InputDataBean> dataSet = new ArrayList<InputDataBean>();
        FileInputStream fstream = null;
        BufferedReader br = null;
        try{
            fstream = new FileInputStream(filePath);
            br = new BufferedReader(new InputStreamReader(fstream));
            String strLine;
            Set<String> users = new TreeSet<String>();
            while ((strLine = br.readLine()) != null)   {
                InputDataBean data = validateRecord(strLine);
                if(data==null)
                    continue;
                dataSet.add(data);
                users.add(data.getFromName());
                users.add(data.getToName());
            }
            UserKeys.setUsers(users);

        }catch (Exception e){
            throw e;
        }finally{
            try {
                if(null!=br)
                    br.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return dataSet;
    }

读取文件后,我想将数据存储到数据库中。

如果有任何其他更好的替代方案来阅读文件?从java程序调用脚本并使用脚本读取数据并存储到java数组中是个好主意。

P.S。:如果有人可以编辑或改进标签,我真的很感激。

1 个答案:

答案 0 :(得分:3)

可能在FileInputStream周围包裹BufferedInputStream将进一步提高性能(因为读取将以4 KB的倍数进行缓冲)。你也可以用缓冲区大小来玩。

如果您知道它只是ASCII,则可以避免使用Reader,并可能避免为每一行创建String

如果您有时间,我会将您的解决方案的性能与现有的CSV阅读器工具进行比较,例如CSV tool from the H2 database(披露:我写了它)。