Java: изменить имя ZipEntry

У меня есть следующий код, который пишет текстовый файл в ZIP:

FileOutputStream fOut = new FileOutputStream(fullFilename, false);
BufferedOutputStream bOut = new BufferedOutputStream(fOut);
ZipOutputStream zOut = new ZipOutputStream(bOut);

zOut.putNextEntry(new ZipEntry("aFile1.txt"));
//Do some processing and write to zOut...
zOut.write(...);
(...)
zOut.closeEntry();

zOut.close();
//Etc (close all resources)

Мне нужно будет изменить имя файла zipEntry после того, как он был написан (так как его имя будет зависеть от его написанного содержимого).

Кроме того, это не вариант записи в буфер и записи в файл только тогда, когда известно окончательное имя файла (поскольку размер файла потенциально очень большой: недостаточно памяти).

Любой совет о том, как это сделать, будет принята с благодарностью!

Спасибо Томас

2 ответа

Решение

Это отсутствующая функциональность, которая могла бы быть простой, поскольку сами записи не сжимаются.

Самым простым способом, требующим переписывания, является файловая система zip: начиная с java 7 вы можете использовать zip-файл в качестве виртуальной файловой системы: запись, переименование и перемещение файлов в них. Пример. Вы копируете файл из обычной файловой системы в файловую систему zip, а затем переименовываете файл в zip.

// Create the zip file:
URI zipURI = URI.create("jar:file:" + fullFilename); // "jar:file:/.../... .zip"
Map<String, Object> env = new HashMap<>(); 
env.put("create", "true");
FileSystem zipFS = FileSystems.newFileSystem(zipURI, env, null);

// Write to aFile1.txt:
Path pathInZipfile = zipFS.getPath("/aFile1.txt");
BufferedWriter out = Files.newBufferedWriter(pathInZipfile,
        StandardCharsets.UTF_8, StandardOpenOption.CREATE_NEW);
out.write("Press any key, except both shift keys\n");
out.close();

// Rename file:
Path pathInZipfile2 = zipFS.getPath("/aFile2.txt");
Files.move(pathInZipfile, pathInZipfile2);

zipFS.close();

В принципе, вы также можете сохранить свой старый код - без переименования. И используйте файловую систему zip только для переименования.

Как насчет сохранения содержимого aFile1.txt во временный файл на диске, его переименования и последующего создания zip-файла? Последним шагом может быть удаление файла, который вы создали на диске.

Другие вопросы по тегам