gpt4 book ai didi

java - 将 ZipEntry 复制到新 ZipFile 的惯用方法是什么?

转载 作者:行者123 更新时间:2023-12-03 18:20:40 25 4
gpt4 key购买 nike

我正在编写一个工具来在 DOCX 文件中进行一些小的文本替换,这是一种压缩格式。我的方法是使用 ZipOutputStream 将原始文件条目中的 ZipEntry 内容复制到修改后的文件中。对于大多数 DOCX 文件,这工作得很好,但偶尔我会遇到 ZipExceptions 关于我编写的内容与 ZipEntry 中包含的元信息之间的差异(通常是压缩大小的差异)。

这是我用来复制内容的代码。为简洁起见,我去掉了错误处理和文档处理;到目前为止,我在文档条目方面没有遇到任何问题。

ZipFile         original = new ZipFile(INPUT_FILENAME);
ZipOutputStream outputStream = new ZipOutputStream(new FileOutputStream(OUTPUT_FILE));
Enumeration entries = original.entries();
byte[] buffer = new byte[512];
while (entries.hasMoreElements()) {
ZipEntry entry = (ZipEntry)entries.nextElement();
if ("word/document.xml".equalsIgnoreCase(entry.getName())) {
//perform special processing
}
else{
outputStream.putNextEntry(entry);
InputStream in = original.getInputStream(entry);
while (0 < in.available()){
int read = in.read(buffer);
outputStream.write(buffer,0,read);
}
in.close();
}
outputStream.closeEntry();
}
outputStream.close();

ZipEntry 对象从一个 ZipFile 直接复制到另一个的正确或惯用方法是什么?

最佳答案

我找到了避免该错误的解决方法。通过创建一个仅包含名称字段集的新 ZipEntry,我可以毫无问题地复制内容。

ZipFile         original = new ZipFile(INPUT_FILENAME);
ZipOutputStream outputStream = new ZipOutputStream(new FileOutputStream(OUTPUT_FILE));
Enumeration entries = original.entries();
byte[] buffer = new byte[512];
while (entries.hasMoreElements()) {
ZipEntry entry = (ZipEntry)entries.nextElement();
if ("word/document.xml".equalsIgnoreCase(entry.getName())) {
//perform special processing
}
else{
// create a new empty ZipEntry
ZipEntry newEntry = new ZipEntry(entry.getName());
// outputStream.putNextEntry(entry);
outputStream.putNextEntry(newEntry);
InputStream in = original.getInputStream(entry);
while (0 < in.available()){
int read = in.read(buffer);
if (read > 0) {
outputStream.write(buffer,0,read);
}
}
in.close();
}
outputStream.closeEntry();
}
outputStream.close();

但是,我这种方法会丢失存储在原始 ZipEntry 字段中的任何元信息(例如:评论、额外)。 API 文档并不清楚这是否重要。

关于java - 将 ZipEntry 复制到新 ZipFile 的惯用方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11766741/

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