Объединение zip-файлов в память с помощью Java

Мне нужно связать несколько почтовых файлов (банок). Я пробовал следующие решения:

  1. Перейдите из ZipInputStream в ZipOutputStream, просматривая каждую запись входного потока и копируя ее в выходной поток (насколько я понимаю, это в основном интенсивная операция ввода-вывода, происходящая на жестком диске) с использованием кода, как в этом вопросе о переполнении стека.

  2. Создайте в файловой системе памяти, извлеките оба архива в один и тот же каталог, а затем снова сожмите. Я использую jimfs - https://github.com/google/jimfs

Вариант 2 занял у меня примерно в 5 раз меньше.

Я искал готовое решение для почтового индекса в памяти фс, но не нашел ни одного. Кроме того, jimfs нельзя комбинировать с Java 7 nio zipfs (нет API для использования zipfs с подчеркиванием jimfs).

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

2 ответа

Решение

К счастью, существует способ связать ZipFS с JIMFS, то есть обработать файл (который хранится в памяти - JIFS) как файловую систему Zip.

  FileSystems.newFileSystem(
      URI.create("jar:" + pathToZipFile.toUri()),
      Collections.singletonMap("create", "true"));

где pathToZipFile - файл jar, хранящийся в JIMFS

Что насчет этого:

  1. Для данного почтового файла найти все записи файла;
  2. Прочитайте каждую запись в байте [];
  3. Здесь у вас есть карта;
  4. Определить уникальный ключ для zip-файла;
  5. Создать карту>, которая хранит в памяти все прочитанные zip-файлы.
Другие вопросы по тегам