2017-01-25 17 views
0

Я получаю из XML-файлов webservice, сжатых в формате gzip. Исходный размер xmls составляет около 80 Мб, а сжатая версия - около 10 МБ. Эти xml-файлы хранятся в нашем кеше.Замените содержимое в файле gzip без его распаковки

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

Таким образом, этот процесс должен быть:

  1. Распаковка XML-кэша.
  2. Замените кешированный идентификатор на один полученный из веб-службы.
  3. Снова сжать файл и вернуть его клиенту.

Это программное обеспечение для Java. Мне было интересно, есть ли возможность выполнить эту замену без распаковки всего документа и сжатия его снова. Любой вид частичного чтения и записи ... Я не знаю.

Я искал библиотеку java, которая могла бы это сделать, но я ничего не нахожу (может быть, потому, что это невозможно).

Любая идея? Благодарю.

+0

Можете ли вы показать код, в котором вы декомпрессируете, заменяете, а затем снова сжимаете? Может быть место для улучшения –

+0

Пока не закодировано, но идея такова: 1. создать байт [] с несжатым документом (используя gzipinputstream). 2. Замените 8-значный байт на байт (избегая любой временной копии). 3. сжать этот байт [] с помощью gzipoutputstream. – JBalaguero

ответ

0

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

Если вы контролируете сжатие начальной точки, вы можете специально подготовить поток для этого, переключившись на отсутствие сжатия прямо перед идентификатором, промыв блок, сохраненный блок, сразу после идентификатора, а затем продолжая сжимать. Вы можете отметить, где находится выходной поток. Затем вы можете позже заменить идентификатор, который отображается в потоке как эти байты напрямую. Вам также потребуется обновить CRC, для которого вы можете использовать эксклюзивный или оригинальный CRC с «необработанным» CRC эксклюзивного или старого несжатого данных и новых несжатых данных. Это просто эксклюзивный код или старый идентификатор и идентификатор с кучей нулей, предшествующих и последующих, чтобы заполнить длину данных. «Необработанный» CRC - это тот, в котором регистр CRC инициализируется нулями и для которого нет окончательного исключения - или.