Записать массив байтов в ZipArchiveOutputStream

Мне нужно создать zip-файл, и я ограничен следующими условиями:

  • Записи поступают как byte[] (или ByteArrayOutputStream), а не как файл.
  • Имена файлов для записи могут быть не-ascii/UTF-8.
  • JDK 1.6 или более ранней версии

Поскольку java.util.zip поддерживает только имена файлов UTF-8 из JDK 1.7 и более поздних версий, лучше использовать ZipArchiveOutputStream с общим сжатием. Но как создать ZipEntryArchive на основе массива байтов или ByteArrayOutputStream, а не на основе файла?

Благодарю вас!


person bz3x    schedule 07.09.2013    source источник
comment
Что вы подразумеваете под не-UTF-8 - любой символ Unicode можно закодировать с использованием UTF-8.   -  person Jesper    schedule 07.09.2013
comment
@Jesper Я имел в виду не-ascii, UTF-8, не-латиницу...   -  person bz3x    schedule 08.09.2013


Ответы (1)


Следующий метод принимает byte[] в качестве входных данных, создает zip и возвращает его содержимое в виде другого byte[]. Все делается по памяти. Нет операций ввода-вывода на диск. Я убрал обработку исключений для лучшего обзора.

    byte[] zip(byte[] data, String filename) {
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ZipArchiveOutputStream zos = new ZipArchiveOutputStream(bos);

        ZipArchiveEntry entry = new ZipArchiveEntry(filename);
        entry.setSize(data.length);
        zos.putArchiveEntry(entry);
        zos.write(data);
        zos.closeArchiveEntry();

        zos.close();
        bos.close();

        return bos.toByteArray();       
   }

Это решает вашу проблему?

person roehrijn    schedule 07.09.2013