Добавить данные в файл gzip с Java

У меня есть файл журнала, который может быть огромным (> 4 ГБ), поэтому я подумываю о том, чтобы "скопировать его на лету", то есть я хотел бы вставить текст непосредственно в конец файла gzip (я хочу создать мой собственный файл appender для входа в систему). Можно ли добавить материал в существующий файл gzip? Похоже, что единственный способ - открыть существующий с помощью GZIPInputStream, прочитать его и записать данные в новый файл с помощью GZIPOutputStream, добавить новый материал в конец этого нового файла, а затем, я полагаю, удалить старый gzip и переименовать новый к старому имени ...

Я не прав? Лучшие идеи?

Спасибо!

4 голоса | спросил Maxime Laval 7 J0000006Europe/Moscow 2012, 06:11:50

4 ответа


0

Вы можете посмотреть примеры, которые входят в дистрибутив zlib, как добавлять файлы gzip и как создавать растущий файл gzip для записей журнала. Вы можете получить дистрибутив zlib с zlib.net и посмотреть на examples /gzappend.c , examples /gzlog.c и examples /gzlog.h . Они написаны на C и могут потребовать возможности zlib, которые нелегко получить, используя интерфейс java.util.zip для zlib.

Эти подходы не требуют воссоздания gzip-файла.

ответил Mark Adler 7 J0000006Europe/Moscow 2012, 06:47:24
0

Формат gzip позволяет объединять потоки байтов, ранее записанные в gzip, что позволяет отображаться как одна строка при распаковке.

Просто добавьте данные gzip в конце.

ответил Jé Queue 7 J0000006Europe/Moscow 2012, 07:08:34
0

Хотя я не знаю специфичного для Java решения этой проблемы, есть некоторые нативные системные решения (при условии, что вы используете * nix и не заботитесь о том, что это не зависит от платформы). Этот вопрос в Unix /Linux SE предлагает некоторые идеи для этого (а именно, сжатые петлевые файловые системы):

Добавить /обновить файл в существующий архив tar.gz?

ответил Dave Forgac 7 J0000006Europe/Moscow 2012, 06:23:36
0

Передайте true в конструктор FileOutputStream Второй аргумент для получения режима добавления.

File f = new File("out.gz");
OutputStream os = new GZIPOutputStream(new FileOutputStream(f, true)); // true for append
PrintWriter w = new PrintWriter(new OutputStreamWriter(os));
w.println("log message");

В моих образцах данных это сжатие лучше, чем уровень сжатия по умолчанию gzip. (Это было немного лучше, чем уровень 7, но не так хорошо, как уровень 8).

$ ls -asl out.gz
88 -rw-r--r--  1 jem  staff  41859  5 Jul 07:42 out.gz
$ gunzip out.gz
$ gzip out
$ ls -asl out.gz
88 -rw-r--r--  1 jem  staff  42164  5 Jul 07:42 out.gz
ответил Synesso 5 J000000Thursday18 2018, 00:59:14

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132