Как получить позицию в файле (байтовую позицию) из java-сканера?

Как получить позицию в файле (байтовую позицию) из java-сканера?

Scanner scanner = new Scanner(new File("file"));
scanner.useDelimiter("abc");
scanner.hasNext();
String result = scanner.next();

а теперь: как получить позицию результата в файле (в байтах)?

Использование scan.match().start() не является ответом, потому что оно дает позицию во внутреннем буфере.


person Community    schedule 08.03.2010    source источник


Ответы (3)


Возможно, используя RandomAccessFile.. попробуйте это..

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;

public class RandomFileAccessExample 
{
    RandomFileAccessExample() throws IOException
    {
        RandomAccessFile file = new RandomAccessFile("someTxtFile.txt", "r");
        System.out.println(file.getFilePointer());
        file.readLine();
        System.out.println(file.getFilePointer());
    }
    public static void main(String[] args) throws IOException {
        new RandomFileAccessExample();
    }

}
person raj    schedule 08.03.2010
comment
Хорошо, но с RandomAccessFile я не могу использовать регулярные выражения так просто, как со сканером... - person ; 08.03.2010
comment
вот так! но один из способов сделать это - прочитать все строки, сохранить их в строке и использовать regEx в строке. Я знаю! это звучит очень плохо! :) - person raj; 08.03.2010
comment
java как таковой не предоставляет токенизатор с RandomAccessFile. Что еще мы можем сделать!? строить какую-то логику. читать построчно и токенизировать его.! - person raj; 08.03.2010

Scanner обеспечивает абстракцию базового Readable, содержимое которого не обязательно должно происходить из File. Он не поддерживает напрямую низкоуровневый запрос, который вы ищете.

Возможно, вы сможете вычислить это число, объединив позицию внутреннего буфера в соответствии с Scanner и количество прочитанных байтов в соответствии с Readable, но даже это выглядит непростым делом. Если приблизительное местоположение в огромном файле приемлемо, то этого может быть достаточно.

person polygenelubricants    schedule 08.03.2010

Вы можете получить приблизительную позицию файла, используя пользовательский FileInputStream для создания сканера, например:

final int [] aiPos = new int [1];
FileInputStream fileinputstream = new FileInputStream( file ) {
   @Override
   public int read() throws IOException {
       aiPos[0]++;
       return super.read();
   }
   @Override
   public int read( byte [] b ) throws IOException {
       int iN = super.read( b );
       aiPos[0] += iN;
       return iN;
   }
   @Override
   public int read( byte [] b, int off, int len ) throws IOException {
       int iN = super.read( b, off, len );
       aiPos[0] += iN;
       return iN;
   }
};

Scanner scanner = new Scanner( fileinputstream );

Это даст вам позицию с точностью до 8 КБ или около того, в зависимости от реализации FileInputStream. Это полезно для таких вещей, как обновление индикаторов выполнения во время синтаксического анализа файла, когда вам не нужна точная позиция, просто что-то достаточно близкое.

person Wade Walker    schedule 12.05.2010