Как реализовать поиск () и getFilePointer () в RandomAccessFile с использованием FileInputStream и BufferReader? - PullRequest
1 голос
/ 18 августа 2011

Я хотел бы открыть файл, содержащий текст в кодировке UTF-8, может установить положение, прочитать 25 строк, может получить положение.

К сожалению, RandomAccessFile не поддерживает кодировку UTF-8. Итак, я написал этот код. Я рекурсивно вызываю метод getParsedLines () с возвращенным значением смещения, чтобы прочитать следующие 25 строк, но он печатает сначала 1-25 строк, затем выводит 349-373, 695-719 и так далее.

public long getParsedLines(File file, long offset) {


    int counter = 0;
    FileInputStream fis = null;
    InputStreamReader streamReader = null;
    BufferedReader br = null;
    try {
        fis = new FileInputStream(file);
        fis.getChannel().position(offset);
        streamReader = new InputStreamReader(fis, "UTF8");
        br = new BufferedReader(streamReader);
        String str;
        while (counter <= 24) {
            if ((str = br.readLine()) != null) {
                System.out.println(str);
            } else {
                offset = -1;
                break;
            }
            counter++;
        }
        if (fis != null) {
            offset = fis.getChannel().position();

        }
    } catch (IOException ex) {
    } finally {
        try {
            if (fis != null) {
                fis.close();
            }
        } catch (IOException ex) {
        }

    }

    return offset;
}

как получить последнее смещение правильно, чтобы я мог напечатать 1-25, 26-50, 51-75. 76-100 и т. Д.

Да .. Для некоторой обратной совместимости у меня есть ограничение, что я должен читать текстовый файл «построчно», используя readLine (), и читать только 25-25 строк за раз, а не весь текст.

Ответы [ 3 ]

1 голос
/ 18 августа 2011

BufferedReader читает вперед, поэтому позиция в базовом файле> логическая позиция, которую достиг BufferedReader.Вы можете попробовать DataInputStream.readLine (), который этого не делает, и который устарел, и который не решает проблемы, упомянутые в Javadoc, против устаревания.

0 голосов
/ 29 июля 2013

Поддерживает UTF.пожалуйста, обратитесь по этому адресу: http://www.tutorialspoint.com/java/io/randomaccessfile_seek.htm

0 голосов
/ 18 августа 2011

Если вы должны сделать это таким образом, вы можете использовать метод BufferedReader.skip для пропуска символов (сохранив счетчик числа уже прочитанных символов). Но, если возможно, я бы посоветовал просто сохранить тот же BufferedReader (не закрывая его), чтобы он в любом случае автоматически находился в нужном месте.

...