#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 не упоминается в коде в вашем вопросе, тогда я предлагаю вам отредактировать вопрос с подробностями кода, который вы на самом деле запускаете.