Можете ли вы перескочить сканер к месту в файле или отсканировать назад? - PullRequest
4 голосов
/ 17 июня 2010

У меня очень большой текстовый файл, и мне нужно собрать данные где-то ближе к концу. Возможно, Сканер не лучший способ сделать это, но было бы очень расточительно начать с самого начала и набрать 6000 строк, прежде чем перейти к той части файла, которая мне интересна. Есть ли способ либо сказать Сканеру, чтобы перейти скажем, 7/8 вниз по документу или начать снизу и сканировать вверх, захватывая строку за строкой?

Спасибо

Ответы [ 3 ]

5 голосов
/ 17 июня 2010

Основным источником входного сигнала для java.util.Scanner является java.lang.Readable.Помимо конструктора Scanner(File), Scanner не знает и не заботится о том, что он сканирует файл.

Кроме того, поскольку это регулярное выражение основано на 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
2 голосов
/ 17 июня 2010

Вы, вероятно, должны использовать RandomAccessFile вместо.

2 голосов
/ 17 июня 2010

Scanner переносит InputStream, вы можете использовать метод потока skip(long), чтобы пропустить ненужные строки, а затем начать сканирование.

Подробнее в InputStream Javadoc

...