Объединение zip-файлов в память с помощью Java
Мне нужно связать несколько почтовых файлов (банок). Я пробовал следующие решения:
Перейдите из ZipInputStream в ZipOutputStream, просматривая каждую запись входного потока и копируя ее в выходной поток (насколько я понимаю, это в основном интенсивная операция ввода-вывода, происходящая на жестком диске) с использованием кода, как в этом вопросе о переполнении стека.
Создайте в файловой системе памяти, извлеките оба архива в один и тот же каталог, а затем снова сожмите. Я использую 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
Что насчет этого:
- Для данного почтового файла найти все записи файла;
- Прочитайте каждую запись в байте [];
- Здесь у вас есть карта;
- Определить уникальный ключ для zip-файла;
- Создать карту>, которая хранит в памяти все прочитанные zip-файлы.