Java扫描器"rewind"

3
我正在使用Java Scanner对象来解析文本文件。 我需要扫描文件的一部分两次(出于性能原因,这样我就不必暂时存储它的内容)。
因此,是否有一种方法可以将Scanner“倒回”到特定的文件位置?
或者,有没有一种方法可以克隆扫描仪,以便我可以独立使用每个实例(即它们不会移动彼此的文件位置指针)?
非常感谢, Thomas
编辑: 显然,只扫描文件一次并直接处理它总是可行的,但会在我们现有的代码库中创建重要的额外复杂性,因此需要扫描同一部分文件两次。
简而言之:文件包含数千个逻辑项,为了处理其中的一些项,我需要从项目开头获取存储在项目末尾的信息。

1
你的性能限制是什么?文本文件很大吗?否则,只需多次处理它可能会足够快,并在出现问题时进行优化。 - Rory Hunter
2
文件大小需要多少GB才能比保存所需内容更有效率地重新读取?10 GB,100 GB,1 TB? - Peter Lawrey
3
不应该使用Scanner,而应该使用真正的文件IO,可以选择RandomAccessFile或NIO。http://docs.oracle.com/javase/tutorial/essential/io/rafs.html - Brian Roach
@BrianRoach 这些库确实使得解析文本变得棘手。 - Peter Lawrey
2个回答

5
只需在需要时创建新的Scanner实例即可,即使可以克隆也没有必要或好处。如果您需要重新读取文件,只需创建一个新的Scanner即可,不需要“倒带”。我建议研究一下存储所需位的方法,我相信这会更有效率。
另外,考虑告诉我们更多关于您的要求和任何限制背后的原因,这些信息可以帮助我们给出更好的答案。

1
谢谢,但是新扫描器如何“指向”文件中的同一位置呢? - Tom
1
@Tom为什么不告诉我们更多关于你在这里尝试实现的具体内容呢? - Hovercraft Full Of Eels
2
请根据需要使用skip或seek。 - Peter Lawrey
3
对于Scanner,没有seek方法,只有skip方法,但是skip需要与Pattern一起使用。Scanner不是一个Reader - nhahtdh
你需要跳过或寻找底层流并从那里读取。这意味着在许多情况下需要使用新的Scanner,因为它是有状态的。 - Peter Lawrey
显示剩余3条评论

0

1
谢谢,但我实际需要的是将文件倒回到特定位置(而不是文件开头)。干杯 - Tom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接