我想创建一个zip,它存储两个名称相同的不同文件,但由于
,我无法使用java.util.zip.ZipOutputStream
)
java.util.zip.ZipException:重复条目:
异常。我知道这是可能的,但我需要建议我可以用于此目的的库。谢谢!
使用以下代码更新代码
File zipFile = new File("C:\\Users\\user\\Desktop\\old.zip");
File outFile = new File("C:\\Users\\user\\Desktop\\new.zip");
if(!outFile.exists()) {
outFile.getParentFile().mkdirs();
outFile.createNewFile();
}
byte[] buf = new byte[1024];
ZipInputStream zin = new ZipInputStream(new FileInputStream(zipFile));
ZipOutputStream out = new ZipOutputStream(new FileOutputStream(outFile));
ZipEntry entry = zin.getNextEntry();
while (entry != null) {
String name = entry.getName();
out.putNextEntry(new ZipEntry(name));
int len;
while ((len = zin.read(buf)) > 0) {
out.write(buf, 0, len);
}
entry = zin.getNextEntry();
if("file".equals(name)) {
File fakeFile = new File("C:\\Users\\user\\Desktop\\file");
InputStream in = new FileInputStream(fakeFile);
out.putNextEntry(new ZipEntry("file"));
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
out.closeEntry();
in.close();
}
}
zin.close();
out.close();
答案 0 :(得分:2)
我能够通过反射api绕过限制:
Field namesField = ZipOutputStream.getDeclaredField("names");
namesField.setAccessible(true);
HashSet<String> names = (HashSet<String>) namesField.get(out);
在每次names
电话
putNextEntry
答案 1 :(得分:0)
try (FileOutputStream fos = new FileOutputStream(zipFile);
ZipOutputStream zos = new ZipOutputStream(fos)) {
HashSet<String> names = new HashSet<String>();
for (String filePath : fileList) {
if(names.add(filePath))
{
String name = filePath.substring(directory.getAbsolutePath()
.length() + 1, filePath.length());
ZipEntry zipEntry = new ZipEntry(name);
zos.putNextEntry(zipEntry);
try (FileInputStream fis = new FileInputStream(filePath)) {
byte[] buffer = new byte[1024];
int length;
while ((length = fis.read(buffer)) >= 0) {
zos.write(buffer, 0, length);
}
} catch (Exception e) {
e.printStackTrace();
throw new Exception();
}
zos.closeEntry();
}
}
names.clear();
} catch (IOException e) {
e.printStackTrace();
throw new Exception();
}
通过使用HashSet解决了我的zip重复条目问题