RandomAccessFile - хорошее место для начала, как описано в других ответах.Существует одно важное предостережение .
Если ваш файл не закодирован однобайтовым кодированием, метод readLine()
не будетработать на тебя.И readUTF()
не будет работать ни при каких обстоятельствах.(Он читает строку, которой предшествует число символов ...)
Вместо этого вам необходимо убедиться, что вы ищете маркеры конца строки таким образом, чтобы соблюдать границы символов кодировки.Для кодировок фиксированной длины (например, разновидностей UTF-16 или UTF-32) вам необходимо извлечь символы, начиная с позиций байтов, которые делятся на размер символов в байтах.Для кодировок переменной длины (например, UTF-8) вам необходимо найти байт, в котором должен быть первым байтом символа.
В случае UTF-8 первый байт символа будет 0xxxxxxx
или 110xxxxx
или 1110xxxx
или 11110xxx
.Все остальное является либо вторым / третьим байтом, либо недопустимой последовательностью UTF-8.См. Стандарт Unicode, Версия 5.2, Глава 3.9 , Таблица 3-7.Это означает, что, как отмечается в комментариях, любые байты 0x0A и 0x0D в правильно закодированном потоке UTF-8 будут представлять символ LF или CR.Таким образом, простой подсчет байтов 0x0A и 0x0D является допустимой стратегией реализации (для UTF-8), если мы можем предположить, что другие виды разделителя строк Unicode (0x2028, 0x2029 и 0x0085) не используются.Вы не можете этого предположить, тогда код будет более сложным.
Определив правильную границу символа, вы можете просто вызвать new String(...)
, передавая байтовый массив, смещение, число и кодировку, а затем повторновызовите String.lastIndexOf(...)
для подсчета конца строки.