Can you jump a scanner to a location in file or scan backwards?

半腔热情 提交于 2019-12-01 19:50:03

The underlying input source for a java.util.Scanner is a java.lang.Readable. Beyond the Scanner(File) constructor, a Scanner neither knows nor cares of the fact that it's scanning a file.

Also, since it's regex based on java.util.regex.*, there's no way it can scan backward.

To accomplish what you want to do, it's best to do it at the input source level, e.g. by using InputStream.skip of the source before passing it to the constructor of Scanner.


On Scanner.skip

Scanner itself does have a skip, and a pattern like "(?s).{10}" would skip 10 characters (in (?s) single-line/Pattern.DOTALL mode), but this is perhaps a rather roundabout way of doing it.

Here's an example of using skip to skip a given number of lines.

    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());
    }

This prints (as seen on ideone.com):

Line5 bleh
Line6 bloop

Scanner wraps an InputStream, you can use the stream's skip(long) method to skip the lines you don't want and then start scanning.

Read more in the InputStream javadoc

You should probably use RandomAccessFile instead.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!