Чтение gz-файла и отслеживание позиции в файле - PullRequest
5 голосов
/ 06 марта 2011

Итак, вот такая ситуация:

Мне нужно прочитать большие архивы .gz (ГБ) и что-то вроде «проиндексировать» их, чтобы в дальнейшем можно было получать определенные фрагменты с использованием произвольного доступа.Другими словами, я хочу построчно читать архив и иметь возможность получить конкретное место в файле для любой такой строки.(так что я могу прыгать прямо в эти конкретные места по запросу).(PS: ... и это UTF-8, поэтому мы не можем предположить, что 1 байт == 1 символ.)

Итак, в общем, мне просто нужен BufferedReader, который отслеживает его местоположение в файле.Однако этого, похоже, не существует.

Есть ли что-нибудь доступное или мне нужно накатить свое?

Несколько дополнительных комментариев:

  • Я не могу использовать BufferedReader напрямую, поскольку расположение файла соответствует тому, что было буферизовано до сих пор.Другими словами, кратный размеру внутреннего буфера вместо расположения строки.
  • Я не могу использовать InputStreamReader напрямую из соображений производительности.Небуферизованный способ был бы медленным, и, между прочим, не хватает удобных методов для чтения строк.
  • Я не могу использовать RandomAccessFile, поскольку 1. он заархивирован, а 2. RandomAccessFile использует «модифицированный» UTF-8

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

Спасибо за подсказки,

Arnaud

Ответы [ 3 ]

4 голосов
/ 06 марта 2011

Я думаю, JZRAN может быть в значительной степени то, что вы ищете:

Это библиотека Java, основанная на zran.c образец из zlib.

Вы можете предварительно обработать большой GZIP архив, производящий «индекс», который может использоваться для произвольного доступа для чтения.

Вы можете балансировать между размером индекса и скорость доступа.

0 голосов
/ 06 марта 2011

Сжатие GZIP не поддерживает поиск.Предыдущие блоки данных необходимы для построения таблиц сжатия ...

0 голосов
/ 06 марта 2011

То, что вы ищете, называется mark(), markSupported() и skip().

Эти методы объявлены как в InputStream, так и в Reader, поэтому вы можете использовать их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...