java:更改ZipEntry名称

时间:2014-01-24 23:00:51

标签: java file-io zip

我有以下代码将文本文件写入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 个答案:

答案 0 :(得分:3)

这是一个缺失的功能,可能很简单,因为条目本身不会被压缩。

最简单的方法,需要重写,是zip FileSystem:因为java 7你可以使用zip文件作为虚拟文件系统:写入,重命名和移动文件。一个example。您将文件从普通文件系统复制到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文件系统进行重命名。

答案 1 :(得分:0)

如何将aFile1.txt的内容保存到磁盘上的临时文件,重命名,然后再创建zip文件?最后一步可以删除您在磁盘上创建的文件。