Присвоение имени файла zip в Java и преобразование его в ByteArrayOutputStream

#java #zip #fileoutputstream #zipoutputstream

Вопрос:

В настоящее время я пытаюсь создать zip-файл с помощью ZipOutputStream и вернуть его обратно как ByteArrayOutputStream.

Однако в настоящее время мне интересно, как я могу назначить имя файла для самого почтового индекса.

Прямо сейчас он всегда будет сгенерирован с именем ‘application.zip-чего я не хочу.

Я попытался назначить его с помощью FileOutputStream, но после его декодирования он по-прежнему использует имя по умолчанию, так что не повезло.

Вот код:

     private static ByteArrayOutputStream convertZipToByte(
        final String fname, final String content) {
    try {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        FileOutputStream fos = new FileOutputStream("usethisinstead.zip");
        baos.writeTo(fos);
        final ZipOutputStream zos = new ZipOutputStream(baos);
        ZipEntry entry = new ZipEntry(fname);

        zos.putNextEntry(entry);
        zos.write(content.getBytes());
        zos.closeEntry();

        return baos;
    } catch (IOException ex) {
        // throwing error ex here
    }
}
 

Комментарии:

1. Ваш код просто пишет пустой файл, перемещается baos.writeTo(fos); в конец и закрывает все открытые потоки с помощью try-with-resources.

Ответ №1:

Вы всегда должны закрывать потоки в нужный момент, попробуйте с ресурсами справиться с этим автоматически.

Разделение zip-файла от записи файла упрощает логику и повторное использование вызовов NIO, что-то вроде этого:

 private static ByteArrayOutputStream
convertZipToByte(final String fname, final String content, final Path zip)
    throws IOException {

    ByteArrayOutputStream baos = new ByteArrayOutputStream();

    try(ZipOutputStream zos = new ZipOutputStream(baos)) {
        ZipEntry entry = new ZipEntry(fname);

        zos.putNextEntry(entry);
        zos.write(content.getBytes());
        zos.closeEntry();
    }
    try(OutputStream fos = Files.newOutputStream(zip)) {
        baos.writeTo(fos);
    }

    return baos;
}
 

Для того, чтобы вызвать вышеизложенное, создайте файловую систему Path , такую как с:

 convertZipToByte("content.txt","Hello World", Path.of("my.zip"));
 

Комментарии:

1. Проблема сохраняется. Когда я закодирую ByteArray и расшифрую его позже, почтовый индекс будет переименован в ‘application.zip». Мне нужно убедиться, что имя файла zip остается нетронутым.

2. Как application.zip не упоминается в коде в вашем вопросе, тогда я предлагаю вам отредактировать вопрос с подробностями кода, который вы на самом деле запускаете.