开发者社区> 问答> 正文

Java中如何快速按行读大文件:报错

需求:读取日志文件(大于2GB),文件内容超过2千万行,实现从指定行数开始往后读取若干行内容,如:从1500万行往后读500行,或从1900万行往后读600行等。

如何快速的定位指定的行数,如何高效的实现文件内容读取,各位达人请指点,谢过先。


----------------------------------------------

另:已使用BufferedReader试过,没法快速定位行数,越往后时间消耗越多,最糟糕的达到30s,这个结果没法接受。

展开
收起
kun坤 2020-06-06 23:54:32 575 0
1 条回答
写回答
取消 提交回答
  • 先用按行把文件分割了,文件进行编号再读取定位行数

    分割方法:http://kerry.blog.51cto.com/172631/292485

    ######

    引用来自“scylla”的评论

    先用按行把文件分割了,文件进行编号再读取定位行数
    日志文件在生成的时候就应该分割######补充一下java下有支持随机读的 RandomAccessFile.seek######回复 @MZHS : 恩,我说的这种情况,也可能与它的这种情况不太一样。 文件过大确实需要分割的,还有我说的那种本身单个文件大小在30M左右,顺序读。 他这个需求如果只是读取定位的话,是可以按照自定义标识符的就像你说的这样。可以写一个LINE_END_CHAR######回复 @MZHS : 的确定位的问题暂时没有好的办法######回复 @宇智波带土 : 那读取某行内容的时候,你还得读索引文件,你的索引文件只提供了行号和数据,并不能起到快速定位的作用,如果想快速定位,就要分而治之,要知道什么位置的行号是多少,要达到这种效果就要把大文件分小,给了行号就知道去第几个文件的第几行或者放置在内存中 个人愚见######回复 @MZHS : 可以定义一个索引文件,记录当前读取的行数,还有写入等数据。######难就难在你怎么知道多少字节后是一行的开始######建议,多线程读取,根据文件大小将文件分割成若干块,块末尾读取看是不是分行符号,如果是分行符号,则确定该块长度。再用 RandomAccessFile.seek去读取 @宇智波带土 @yangrfa 

    只提供解决方案,可行与否,慎重斟酌

    ######回复 @MZHS : 谢谢提供思路######如果发现不是分行符号,则读取下一个字节,注意块开始和块结尾字节位置的变化######用apache下的common IO包重的LineIterator a=FileUtils.lineIterator(new File("")); 读取试试######

    https://github.com/ikcourage/LFS 建议用 LFS 来记录日志,或者针对目前这个案例,将日志同步到 LFS 会更简单。

    ######谢谢,看看先
    2020-06-06 23:54:37
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载