在 Java 中替换 Zip 文件而不解压缩
Replacing a Zip file without unzipping in Java
我有一个 zip 文件,我想用另一个文件替换其中的一个文件。因此不需要删除 zip 条目,只需将 zip 条目的文件替换为另一个文件即可。
这是我试过的。
public void replaceConfigurationFile(ZipFile zipFile, ZipOutputStream zos, String pathToNewFile, String configFileToReplaced)
throws IOException {
String zipEntryName;
for(Enumeration<?> e = zipFile.entries(); e.hasMoreElements(); ) {
ZipEntry entryIn = (ZipEntry) e.nextElement();
zipEntryName = entryIn.getName();
if(zipEntryName.endsWith(configFileToReplaced)) {
FileInputStream fis = new FileInputStream(pathToNewFile);
ZipEntry zipEntry = new ZipEntry(zipEntryName);
zos.putNextEntry(zipEntry);
byte[] bytes = new byte[1024];
int length;
while ((length = fis.read(bytes)) >= 0) {
zos.write(bytes, 0, length);
}
zos.closeEntry();
fis.close();
} else {
zos.putNextEntry(entryIn);
InputStream is = zipFile.getInputStream(entryIn);
byte [] buf = new byte[1024];
int len;
while((len = (is.read(buf))) > 0) {
zos.write(buf, 0, len);
}
zos.closeEntry();
}
} // enf of for
}
我有一个名为 :
的文件 zip 条目
WEB-INF/classes/config/app-dev.yml
并且我在 d 驱动器位置
有一个文件
D:/app-dev.yml
我可以通过替换我要替换的文件将文件复制到不同的 zip 文件中。但这真的不需要(创建不同的文件)。
那么我应该怎么做才能将文件替换为我的自定义文件。
我在 Whosebug 中搜索了不同的帖子,但无法找到我需要的内容。我读到不能删除 zip 条目,但如何替换它呢?请帮助
您的问题是新文件可能比旧文件大或小!您需要完全按照您所做的来允许更改。 ZIP 压缩后的新文件 与前一个文件大小完全相同 的概率几乎为零。
标准 Java ZIP 文件库不允许您更新现有的 ZIP 文件。您需要使用第三方库。 Google 搜索应该会为您找到许多备选方案。
但是您需要注意以下几点:
如果您的应用程序...或系统...在更新 ZIP 文件时崩溃,文件可能已损坏。
更新 ZIP 文件时,文件的替换版本将附加到 ZIP 中。旧版本的仍将在 ZIP 中...但不在 ZIP 文件索引中。因此更新 ZIP 文件(不重写它)会浪费磁盘 space.
我有一个 zip 文件,我想用另一个文件替换其中的一个文件。因此不需要删除 zip 条目,只需将 zip 条目的文件替换为另一个文件即可。
这是我试过的。
public void replaceConfigurationFile(ZipFile zipFile, ZipOutputStream zos, String pathToNewFile, String configFileToReplaced)
throws IOException {
String zipEntryName;
for(Enumeration<?> e = zipFile.entries(); e.hasMoreElements(); ) {
ZipEntry entryIn = (ZipEntry) e.nextElement();
zipEntryName = entryIn.getName();
if(zipEntryName.endsWith(configFileToReplaced)) {
FileInputStream fis = new FileInputStream(pathToNewFile);
ZipEntry zipEntry = new ZipEntry(zipEntryName);
zos.putNextEntry(zipEntry);
byte[] bytes = new byte[1024];
int length;
while ((length = fis.read(bytes)) >= 0) {
zos.write(bytes, 0, length);
}
zos.closeEntry();
fis.close();
} else {
zos.putNextEntry(entryIn);
InputStream is = zipFile.getInputStream(entryIn);
byte [] buf = new byte[1024];
int len;
while((len = (is.read(buf))) > 0) {
zos.write(buf, 0, len);
}
zos.closeEntry();
}
} // enf of for
}
我有一个名为 :
的文件 zip 条目WEB-INF/classes/config/app-dev.yml
并且我在 d 驱动器位置
有一个文件 D:/app-dev.yml
我可以通过替换我要替换的文件将文件复制到不同的 zip 文件中。但这真的不需要(创建不同的文件)。 那么我应该怎么做才能将文件替换为我的自定义文件。
我在 Whosebug 中搜索了不同的帖子,但无法找到我需要的内容。我读到不能删除 zip 条目,但如何替换它呢?请帮助
您的问题是新文件可能比旧文件大或小!您需要完全按照您所做的来允许更改。 ZIP 压缩后的新文件 与前一个文件大小完全相同 的概率几乎为零。
标准 Java ZIP 文件库不允许您更新现有的 ZIP 文件。您需要使用第三方库。 Google 搜索应该会为您找到许多备选方案。
但是您需要注意以下几点:
如果您的应用程序...或系统...在更新 ZIP 文件时崩溃,文件可能已损坏。
更新 ZIP 文件时,文件的替换版本将附加到 ZIP 中。旧版本的仍将在 ZIP 中...但不在 ZIP 文件索引中。因此更新 ZIP 文件(不重写它)会浪费磁盘 space.