Я читаю последовательные строки символов из текстового файла. Кодирование символов в файле может быть не однобайтным.
В определенные моменты я хотел бы получить позицию файла, в которой начинается следующая строка, чтобы я мог повторно открыть файл позже и быстро вернуться в эту позицию.
Вопросы
Есть ли простой способ сделать это, желательно, используя стандартные библиотеки Java?
Если нет, то что разумное обходное решение?
Атрибуты идеального решения
Идеальное решение будет обрабатывать множественные кодировки символов. Это включает в себя UTF-8, в котором разные символы могут быть представлены различными байтами. Идеальное решение будет в основном полагаться на надежную, хорошо поддерживаемую библиотеку. Наиболее идеальным будет стандартная библиотека Java. Лучше всего было бы использовать Apache или Google. Решение должно быть масштабируемым. Чтение всего файла в память не является решением. Возврат в позицию не требует считывания всех предыдущих символов в линейном времени.
Подробнее
Для первого требования BufferedReader.readLine()
является привлекательным. Но буферизация явно препятствует получению значимой позиции файла.
Менее очевидно, что InputStreamReader
также может читать вперед, мешая получению позиции файла. Из Документация InputStreamReader:
Чтобы включить эффективное преобразование байтов в символы, большее количество байтов может быть прочитано впереди от базового потока, чем необходимо для выполнения текущей операции чтения.
Метод RandomAccessFile.readLine()
читает один байт на символ.
Каждый байт преобразуется в символ, беря байтовое значение для младших восьми бит символа и устанавливая высокие восемь бит символа равным нулю. Поэтому этот метод не поддерживает полный набор символов Unicode.