5

我有一个非常大的文本文件,我需要从接近尾声的某个地方收集数据。也许 Scanner 不是执行此操作的最佳方法,但是在到达我感兴趣的文件部分之前从顶部开始并抓取 6000 行会非常浪费。有没有办法告诉 Scanner 跳转到说文档向下的 7/8 或从底部开始并逐行向上扫描?

谢谢

4

3 回答 3

5

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
于 2010-06-17T18:27:23.863 回答
2

Scanner包装一个InputStream,您可以使用流的skip(long) 方法跳过您不想要的行,然后开始扫描。

InputStream javadoc中阅读更多内容

于 2010-06-17T18:23:46.680 回答
2

您可能应该改用RandomAccessFile

于 2010-06-17T18:25:29.187 回答