我有一个非常大的文本文件,我需要从接近尾声的某个地方收集数据。也许 Scanner 不是执行此操作的最佳方法,但是在到达我感兴趣的文件部分之前从顶部开始并抓取 6000 行会非常浪费。有没有办法告诉 Scanner 跳转到说文档向下的 7/8 或从底部开始并逐行向上扫描?
谢谢
我有一个非常大的文本文件,我需要从接近尾声的某个地方收集数据。也许 Scanner 不是执行此操作的最佳方法,但是在到达我感兴趣的文件部分之前从顶部开始并抓取 6000 行会非常浪费。有没有办法告诉 Scanner 跳转到说文档向下的 7/8 或从底部开始并逐行向上扫描?
谢谢
a 的基础输入源java.util.Scanner
是 a java.lang.Readable
。除了Scanner(File)
构造函数之外,aScanner
既不知道也不关心它正在扫描文件的事实。
此外,由于它是基于 的正则表达式java.util.regex.*
,因此无法向后扫描。
要完成您想做的事情,最好在输入源级别执行,例如InputStream.skip
在将源传递给Scanner
.
Scanner.skip
Scanner
它本身确实有一个skip
, 和一个类似的模式"(?s).{10}"
会跳过 10 个字符(在(?s)
单行/Pattern.DOTALL
模式下),但这可能是一种相当迂回的方式。
这是一个使用skip
跳过给定行数的示例。
String text =
"Line1 blah blah\n" +
"Line2 more blah blah\n" +
"Line3 let's try something new \r\n" +
"Line4 meh\n" +
"Line5 bleh\n" +
"Line6 bloop\n";
Scanner sc = new Scanner(text).skip("(?:.*\\r?\\n|\\r){4}");
while (sc.hasNextLine()) {
System.out.println(sc.nextLine());
}
这打印(如在 ideone.com 上看到的):
Line5 bleh
Line6 bloop
Scanner
包装一个InputStream
,您可以使用流的skip(long)
方法跳过您不想要的行,然后开始扫描。
在InputStream
javadoc中阅读更多内容
您可能应该改用RandomAccessFile。