Java将文件附加到zip中 [英] Java appending files into a zip

查看:129
本文介绍了Java将文件附加到zip中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述


可能重复:

使用Java将文件附加到zip文件

我有一个包含几个文件夹的zip,但重要的是dir,里面是另一个叫做文件夹和文件夹的文件夹,里面包含很多我需要更新的文件。

I have a zip that contains a few folders in it but the important one is dir and inside that is another folder called folder and folder contains a lot of files that I need to be able to update.

我现在有一个名为dir的zip之外的目录,并且该文件夹中包含我需要更新的文件,因此路径是相同的。如何将这些文件更新为zip?

I have now a dir outside of the zip called dir and in that is folder with the files i need to update in so the paths are the same. How can i update those files into the zip?

棘手的部分是dir是zip的根目录,它包含很多文件夹而不仅仅是文件夹但是我只需要更新文件夹中的文件我不能弄乱文件夹外的任何文件,但仍然在目录中。

The tricky part is that dir is at the root of the zip and it contains a lot of folders not just folder but i only need to update the files in folder i can't mess with any of the files out side of folders but still in dir.

可以这样做吗?我知道这可以使用-u修饰符在bash中完成,但如果可能的话,我更愿意用java来完成。

Can this be done? I know this can be done in bash using the -u modifier but I would prefer to do this with java if it's possible.

感谢您对此问题的任何帮助

Thank you for any help with this issue

更清楚

内部邮编
/ dir /文件夹/ filestoupdate

Inside Zip /dir/folder/filestoupdate

拉链外
/ dir / folder / filestomoveintozip

Outside the zip /dir/folder/filestomoveintozip

推荐答案

好吧,这里是最后一个方法,它是我粘贴的相同方法,之前我实际上从链接@Qwe发布之前的stackoverflow主题获得但是我添加了路径变量以便它可以将文件添加到zip中的文件夹

Alright well here is the final method it's the same method i pastebinned before which i actually got from the stackoverflow topic in the link @Qwe posted before but i added the path variable so that it could add files to folders inside the zip

好吧现在如何在上面的示例中使用它我想将文件添加到另一个文件夹中的文件夹中我会在这样的问题中使用我的设置来做到这一点

Alright so now how to use it in my example above i wanted to add a file into a folder that was inside another folder i would do that using my setup in the question like this

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;
}

感谢链接最终能够改进该方法,以便它可以添加不在根目录中的文件,现在我是一个快乐的露营者:)希望这也有助于其他人出去

Thanks for the link ended up being able to improve that method a bit so that it could add in files that weren't in the root and now i'm a happy camper :) hope this helps someone else out as well

编辑
我在方法上做了一些工作,这样它不仅可以附加到zip上,而且还可以更新zip中的文件

EDIT I worked a bit more on the method so that it could not only append to the zip but it also is able to update files within the zip

使用这样的方法

File[] files = {new File("/path/to/file/to/update/in")};
addFilesToZip(new File("/path/to/zip"), files, "folder/dir/");

你不会用/启动路径(最后一个变量),因为它不是如何在zip条目

You wouldn't start the path (last variable) with / as that's not how it's listed in the zip entries

这篇关于Java将文件附加到zip中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆