好的,这是最终方法,它与我之前在 pastebin 上发布的方法相同,实际上是从 @Qwe 在之前链接中提到的 stackoverflow 主题中获得的,但我添加了路径变量,以便将文件添加到 zip 文件内部的文件夹中。
现在来看看如何在我的示例中使用它。 我想将一个文件添加到另一个文件夹内部的文件夹中,我将使用我在问题中的设置,像这样进行操作:
private void addFilesToZip(File source, File[] files, String path){
try{
File tmpZip = File.createTempFile(source.getName(), null);
tmpZip.delete();
if(!source.renameTo(tmpZip)){
throw new Exception("Could not make temp file (" + source.getName() + ")");
}
byte[] buffer = new byte[4096];
ZipInputStream zin = new ZipInputStream(new FileInputStream(tmpZip));
ZipOutputStream out = new ZipOutputStream(new FileOutputStream(source));
for(int i = 0; i < files.length; i++){
InputStream in = new FileInputStream(files[i]);
out.putNextEntry(new ZipEntry(path + files[i].getName()));
for(int read = in.read(buffer); read > -1; read = in.read(buffer)){
out.write(buffer, 0, read);
}
out.closeEntry();
in.close();
}
for(ZipEntry ze = zin.getNextEntry(); ze != null; ze = zin.getNextEntry()){
if(!zipEntryMatch(ze.getName(), files, path)){
out.putNextEntry(ze);
for(int read = zin.read(buffer); read > -1; read = zin.read(buffer)){
out.write(buffer, 0, read);
}
out.closeEntry();
}
}
out.close();
tmpZip.delete();
}catch(Exception e){
e.printStackTrace();
}
}
private boolean zipEntryMatch(String zeName, File[] files, String path){
for(int i = 0; i < files.length; i++){
if((path + files[i].getName()).equals(zeName)){
return true;
}
}
return false;
}
感谢提供链接,最终我成功改进了该方法,使其能够添加非根目录中的文件,现在我感到非常满意。希望这也能帮助其他需要的人。
编辑
我对该方法进行了进一步改进,使其不仅可以将文件追加到zip文件中,还可以更新zip文件中的文件。
使用该方法的方式如下:
File[] files = {new File("/path/to/file/to/update/in")};
addFilesToZip(new File("/path/to/zip"), files, "folder/dir/");
您不应该以 / 开始路径(最后一个变量),因为它在 zip 条目中不是这样列出的。