Java:扫描文件,但从特定的行索引开始?

时间:2014-10-14 20:47:41

标签: java parsing text-files java.util.scanner

我需要扫描换行符分隔的文本文件,每行可能超过一百万行。由于网络服务器的限制,合理地做到这一点的唯一方法是将过程分解为更小的扫描块。

我能够找到的一种方法是使用Scanner并跳过线,直到达到所需的线索引...但这对于大量扫描而言,其开销不足访问包含数十万行的文件。

RandomAccessFile.skip()InputReader.skip()都允许搜索,但它是以字节为单位测量的,我不能保证每一行都有相同的字节数。有没有办法根据分隔符而不是按字节跳过几行?

或者还有其他办法解决这个问题吗?

3 个答案:

答案 0 :(得分:3)

如果要从特定行开始,则必须计算新行字符。除了某种形式的线性扫描之外,没有办法做到这一点。新行字符不是"特殊"从文件系统的角度来看。

我对Scanner的性能经验不佳。我认为最好的办法是使用带有大缓冲区的BufferedReader

如果您反复使用同一个文件,则应为行偏移创建一个索引,以便快速搜索给定的行。

答案 1 :(得分:1)

没有。如果您的行是可变长度的,那么您需要分析空白以确定它们的结束位置,那么除了顺序扫描文件之外别无选择。您可以用一种方式编写代码,以掩盖您这样做的事实,但这并不会改变性能特征。

答案 2 :(得分:0)

为什么你需要通过线路寻找?抓取一大块N个字节,在最后一个换行符之前进行任何处理。将有一些字节未处理,可能该数字将为零。使用它来退后一步,抓住另一块N字节,依此类推。 (这可能比将部分粘合在一起更容易)

(我假设您正在寻找对整个文件进行某种处理。如果您正在尝试寻找某些行k,请让您的处理步骤为&# 34;计算换行符")