我需要我的应用程序能够读取大型(非常大,100GB+)文本文件,并可能在不同时间处理这些文件中的内容。例如,它可能会运行一个小时并完成几 GB 的处理,然后我将其关闭并在几天后返回以恢复处理同一个文件。
为此,我需要将文件读入内存友好的块;每个块/页/块/等将被读取,一次一个,处理,然后下一个块被读入内存。
我需要程序能够标记它在输入文件中的位置,所以如果它关闭,或者如果我需要“重播”正在处理的最后一个块,我可以直接跳转到文件中我所在的位置并继续处理。具体来说,我需要能够做以下事情:
- 当处理开始时,扫描文件以查找“MARKER”(一些标记,指示我们上次停止处理的位置)
- 如果 MARKER 存在,跳转到它并从该点开始处理
- 否则,如果 MARKER 不存在,则在第一个块之后放置一个 MARKER(现在,假设“块”只是一个文本行,就像
BufferedReader#readLine()
读入的那样)并开始处理第一个块/线 - 对于处理的每个块/行,将标记移动到下一个块之后(因此,将标记进一步向下推进文件)
- 如果我们到达在当前 MARKER 之后没有更多块/行的点,我们已经完成了文件的处理
我尝试自己编写代码,并注意到BufferedReader
上面有一些有趣的方法,听起来它们非常适合这个目的:mark()
、、reset()
等等。但是它们上面的 Javadocs 有点含糊,我不确定这些“文件标记”方法将完成我需要做的所有事情。我也完全对内置此功能的 3rd 方 JAR/lib 持开放态度,但 Google 没有提出任何建议。
这里有什么想法吗?