gpt4 book ai didi

java: 更改 ZipEntry 名称

转载 作者:行者123 更新时间:2023-11-30 08:26:37 25 4
gpt4 key购买 nike

我有以下代码将文本文件写入 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 的文件名(因为它的名称将取决于写入的内容)。

此外,仅当最终文件名已知时才写入缓冲区并写入文件不是一种选择(因为文件大小可能非常大:内存不足)。

如有任何关于如何执行此操作的建议,我们将不胜感激!

谢谢,托马斯

最佳答案

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

虽然需要重写,但最简单的方法是 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 文件系统。

关于java: 更改 ZipEntry 名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21344065/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com