我有一个非常大的文本文件,我需要从接近尾声的某个地方收集数据。也许 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.skipScanner它本身确实有一个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。