У меня проблема с попыткой проанализировать ascii-часть файла, и как только я нажму на конечный тег, НЕМЕДЛЕННО начните чтение байтов с этого момента. Все, что я знаю в Java для чтения строки или целого слова, создает буфер, который уничтожает любую возможность получить байты сразу после моей точки остановки. Единственный способ сделать это читать побайтно, находить новые строки, реконструировать все до новой строки, смотреть, является ли это моим конечным тегом, и идти оттуда?
Java — можно ли прочитать файл построчно, остановиться, а потом сразу начать читать байты там, где я остановился?
Ответы (5)
Насколько велик этот файл? Моя первая мысль - прочитать все это в ByteBuffer или ByteArrayOutputStream, не пытаясь его обработать, а затем найти тег, сравнив значения байтов. Как только вы узнаете, где заканчивается текстовая часть и начинается двоичная часть, вы обрабатываете каждую часть соответствующим образом.
Можно, но насколько я знаю не классами из API.
Вы можете сделать это вручную — откройте его как BufferedInputStream, который поддерживает mark
/reset
. Вы читаете блок за блоком (byte[]
) и анализируете его как ASCII. В конце концов вы накапливаете его в буфере, пока не нажмете на маркер. Но прежде чем read
вы позвоните mark
. Если вы считаете, что прочитали все, что вам нужно, в ASCII, вы вызываете reset
, а затем вызываете read
, чтобы выгрузить остальную часть ASCII-части. И теперь у вас есть BufferedInputStream
(то есть InputStream
), готовый для чтения двоичной части файла.
Reader
. уточняется
- person Marian; 27.08.2009
byte[]
s как List<byte[]>
перед конкатенацией, чтобы избежать повторения System.arraycopy
s BTW, что 100 - это плохо. Вы должны использовать что-то вроде 4096 или 16384.
- person Marian; 27.08.2009
Я думаю, что лучшей идеей было бы отказаться от понятия «линии». Чтобы найти конечный тег, создайте кольцевой буфер, достаточно большой, чтобы вместить конечный тег, читать в него побайтно и после каждого байта проверять, содержит ли он тег.
Существуют более сложные и эффективные алгоритмы поиска, но разница актуальна только для более длинных условий поиска (предположительно, ваш конечный тег короткий).
Да, вы правы насчет байта за байтом. Абстракция имеет свои недостатки.
Файл растет или он статичен?
Если он статический, см. http://java.sun.com/javase/6/docs/api/java/nio/MappedByteBuffer.html