使用具有相同名称的多个文件创建zip

  • 本文关键字:文件创建 zip java java-8 zip
  • 更新时间 :
  • 英文 :


我想将多个文件从不同位置压缩到一个文件中。

我提到https://examples.javacodegeeks.com/core-java/util/zip/create-zip-file-from-multiple-files-with-zipoutputstream/

这是我的代码

公共类CreateZipFileFromMultipleFilesWithZipOutputStream{

public static void main(String[] args) {
String zipFile = "C:/archive.zip";
String[] srcFiles = { "C:/data1/srcfile1.txt", "C:/data2/srcfile2.txt", "C:/data3/srcfile2.txt"};
try {
FileOutputStream fos = new FileOutputStream(zipFile);
ZipOutputStream zos = new ZipOutputStream(fos);
for (int i=0; i < srcFiles.length; i++) {
File srcFile = new File(srcFiles[i]);
ZipEntry zipEntry = new ZipEntry(srcFile.getName());
zos.putNextEntry(zipEntry);
zos.write(Files.readAllBytes(srcFile.toPath()));
zos.closeEntry();
}
// close the ZipOutputStream
zos.close();
}
catch (IOException ioe) {
System.out.println("Error creating zip file: " + ioe);
}
}

}

这引发了一个异常:创建zip文件时出错:java.util.zip.zip异常:重复条目:dsdc.zip

有没有办法检查zip流中是否存在该文件?那么在这种情况下,我可以将_1附加到重复的文件名?

在OpenJDK 8中,这是由ZipOutputStream中的私有字段"names"处理的,该字段未公开。很明显,你应该自己处理。

只需有一个HashSet,其中包含您成功添加到zip文件中的文件名,并在尝试添加新文件之前检查该名称是否以前见过。如果是,请进行相应的修改。

也就是说,如果您的解决方案设计可能会将同一文件的多个副本添加到一个zip文件中,那么您应该重新考虑它。要么包括目录以使文件唯一,要么跳过以前看到的任何内容。

一个解决方案是:

Set<String> uniqueFilenames = new HashSet<>();
for (int i=0; i < srcFiles.length; i++) {
File srcFile = new File(srcFiles[i]);
String name = FilenameUtils.getBaseName(srcFile.getName());
String originalName = name;

for (int j = 1; !uniqueFilenames.add(name); j++) {
name = originalName + "_" + j;
}
ZipEntry zipEntry = new ZipEntry(name + "." + FilenameUtils.getExtension(srcFile.getName()));
zos.putNextEntry(zipEntry);
zos.write(Files.readAllBytes(srcFile.toPath()));
zos.closeEntry();

@Thorbjørn Ravn也提出了类似的建议。但是还有别的办法吗?

最新更新