我想将多个文件从不同位置压缩到一个文件中。
我提到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也提出了类似的建议。但是还有别的办法吗?