选择从大文件中读取什么?

时间:2013-11-30 04:59:27

标签: java input io

你能告诉我,如果我需要读取非常大的(~1Gb).txt文件,其中包含UTF-8中的一些未格式化数据(主要是字符串文本):Scanner,BufferedReader或mb甚至其他东西更好(可能来自NIO或副库)?

2 个答案:

答案 0 :(得分:3)

这取决于您尝试对文件执行的操作。

例如,问问自己:

  • 我需要将其标记化吗?即将其视为“文字”或“符号”的流?
  • 我是否需要将其拆分为多行并一次处理一行?
  • 我是否需要将整个文件加载到内存中?作为一大堆字符,行,标记?

一旦你弄明白了这一点,你正在考虑阅读文件的其中一个替代方案可能会比其他方案更好地匹配。

(如果我们不明白您打算如何处理数据,我们当然无法就最佳读取数据的方式给出合理/平衡的建议。)


我的建议是考虑在花费时间处理效率问题之前如何处理数据。用于读取文件的技术/ API的选择很可能不会限制应用程序的整体性能。

答案 1 :(得分:2)

文件的大小与正确性无关(只要你有足够的ram来存储中间数据),但它在性能方面很重要。 This website解释了如何用Java读取UTF-8。它使用InputStreamReader:

         try {
            Reader reader = new InputStreamReader(
                        new FileInputStream(args[0]),"UTF-8");
            BufferedReader fin = new BufferedReader(reader);

            String line;
            while ((line = fin.readLine())!=null) {
                // do something with line
            }
            fin.close();

        } catch (IOException e) {
            e.printStackTrace();
        }

请注意,他逐行阅读。对于大型文件,IO性能很重要,因此您可能希望以4k或8k字节的块来读取数据。请注意,这可能会破坏字符(因为UTF-8字符可以有一个或多个字节,所以无法预先告知字符是否恰好在块边界上结束)。

在这种情况下,您要么将文本视为数据,直到您完成阅读,或者您必须通过所有读取的字符来查找,如果您必须在处理它之前将最后一个字节附加到下一个块。