Java - возможно ли прочитать файл построчно, остановить, а затем сразу начать читать байты, где я остановился? - PullRequest
2 голосов
/ 27 августа 2009

У меня возникла проблема с попыткой разобрать ascii-часть файла, и как только я нажал на конечный тег, НЕМЕДЛЕННО начинаю читать в байтах с этого момента. Все, что я знаю в Java для чтения строки или целого слова, создает буфер, который разрушает любой шанс получить байты сразу после моей точки остановки. Является ли единственный способ сделать это прочитанным побайтно, найти новые строки, восстановить все до новой строки, посмотреть, является ли это моим конечным тегом, и перейти оттуда?

Ответы [ 5 ]

2 голосов
/ 27 августа 2009

Это возможно, но, насколько я знаю, не с классами из API.

Вы можете сделать это вручную - откройте его как BufferedInputStream , который поддерживает mark / reset. Вы читаете блок за блоком (byte[]) и анализируете его как ASCII. В конце концов вы накапливаете его в буфере, пока не нажмете маркер. Но перед вами read вы звоните mark. Если вы считаете, что прочитали все, что вам нужно в ASCII, вы звоните reset, а затем звоните read, чтобы выгрузить оставшуюся часть ASCII. И теперь у вас есть BufferedInputStream (то есть InputStream), готовый для чтения двоичной части файла.

2 голосов
/ 27 августа 2009

Я думаю, что лучшей идеей было бы отказаться от понятия «линии». Чтобы найти конечный тег, создайте кольцевой буфер , достаточно большой, чтобы в нем содержался конечный тег, читайте в нем побайтово и после каждого байта проверяйте, содержит ли он тег.

Существуют более сложные и эффективные алгоритмы поиска, но различие относится только к более длинным поисковым терминам (предположительно, ваш конечный тег короткий).

1 голос
/ 27 августа 2009

Насколько велик этот файл? Моя первая мысль - прочитать все это в ByteBuffer или ByteArrayOutputStream, не пытаясь его обработать, а затем найти тег, сравнивая байтовые значения. Как только вы знаете, где заканчивается текстовая часть и начинается двоичная часть, вы обрабатываете каждую часть соответствующим образом.

0 голосов
/ 28 августа 2009

Файл растет, или он статический?

Если это статично, см. http://java.sun.com/javase/6/docs/api/java/nio/MappedByteBuffer.html

0 голосов
/ 27 августа 2009

Да, вы правы насчет побайтов. Абстракция имеет свои недостатки.

...