Получение байтового смещения строки в текстовом файле?

У меня есть текстовый файл вроде

one
two
three
four
five

Мне нужно получить смещение каждой строки в файле. Как мне это сделать на Java?

Я просмотрел некоторые библиотеки ввода-вывода (например, BufferedReader и RandomAccessFile), но не могу найти на этот вопрос удовлетворительного ответа.

Кто-нибудь может подсказать, как с этим бороться?


person user3044327    schedule 02.03.2014    source источник
comment
пожалуйста, укажите, например, что смещение в вашем тестовом файле   -  person Dexters    schedule 03.03.2014
comment
Допустим, если я использую метод поиска RandomAccessFile для смещения четырех, следующее чтение произойдет с четырех.   -  person user3044327    schedule 03.03.2014


Ответы (2)


Другой подход заключался бы в подсчете байтов в каждой строке этой строки.

        BufferedReader br = null;   
    try {

        String line;
        // in my test each character was one byte
        ArrayList<Integer> byteoffset = new ArrayList<Integer>();

        br = new BufferedReader(new FileReader("numbers.txt"));
        Integer l = 0;
        while ((line = br.readLine()) != null) {
            System.out.println(line);
            Integer num_bytes = line.getBytes().length;
            System.out.println(num_bytes);
            byteoffset.add( l==0 ? num_bytes : byteoffset.get(l-1)+num_bytes );
            l++;
        }

    } catch ( Exception e) {

    }

в этом примере вам также нужно будет добавить размер символа новой строки \ n к размеру каждой строки

person clancer    schedule 02.03.2014
comment
По крайней мере, одна возможная проблема: разная длина байта для новой строки в режиме текстового файла в зависимости от ОС (Windows \ r \ n, Linux \ n ...) - person deviantfan; 03.03.2014
comment
Да, но приятно, что java предоставляет системный разделитель строк, если вы его используете, длина будет правильной для любой системы, на которой вы работаете. - person clancer; 03.03.2014
comment
Нет, потому что нет гарантии, что файл использует текущее системное соглашение. (ну, моя вещь тоже не совсем переносная, но для Windows, Linux, Mac, Unix ... данные должны работать) - person deviantfan; 03.03.2014

а) Смещение байта 0, т.е. начало файла
б) Откройте файл с чем-то для чтения двоичных байтовых блоков (вместо строк и т. д.),
прочитайте весь файл (в цикле с примерно 4096 байтами каждый раз)
и поиск байтов со значением '\n' в блоке на каждой итерации цикла.
Позиция каждого '\n' плюс счетчик предыдущего блока * 4096 - это еще одно смещение строки.

person deviantfan    schedule 02.03.2014