在Java中无需解压缩即可替换Zip文件

在Java中无需解压缩即可替换Zip文件,java,file,zipinputstream,Java,File,Zipinputstream,我有一个zip文件,我想用另一个文件替换其中的一个文件。因此,不需要删除zip条目,只需将该zip条目的文件替换为另一个 这是我试过的 public void replaceConfigurationFile(ZipFile zipFile, ZipOutputStream zos, String pathToNewFile, String configFileToReplaced) throws IOException { String zipEntryName;

我有一个zip文件,我想用另一个文件替换其中的一个文件。因此,不需要删除zip条目,只需将该zip条目的文件替换为另一个

这是我试过的

public void replaceConfigurationFile(ZipFile zipFile, ZipOutputStream zos, String pathToNewFile, String configFileToReplaced) 
        throws IOException {
    String zipEntryName;
    for(Enumeration<?> e = zipFile.entries(); e.hasMoreElements(); ) {

        ZipEntry entryIn = (ZipEntry) e.nextElement();
        zipEntryName = entryIn.getName();
            if(zipEntryName.endsWith(configFileToReplaced)) {

                FileInputStream fis = new FileInputStream(pathToNewFile);
                ZipEntry zipEntry = new ZipEntry(zipEntryName);

                zos.putNextEntry(zipEntry);

                byte[] bytes = new byte[1024];
                int length;
                while ((length = fis.read(bytes)) >= 0) {
                    zos.write(bytes, 0, length);
                }

                zos.closeEntry();
                fis.close();
            } else {
                zos.putNextEntry(entryIn);
                InputStream is = zipFile.getInputStream(entryIn);
                byte [] buf = new byte[1024];
                int len;
                while((len = (is.read(buf))) > 0) {            
                    zos.write(buf, 0, len);
                }
             zos.closeEntry();  
           }


    } // enf of for
}   
我在位置d有一个文件,驱动器在位置d

 D:/app-dev.yml
通过替换要替换的文件,我可以将文件复制到其他zip文件中。但实际上并不需要(创建不同的文件)。 那么,我应该怎么做才能用自定义文件替换该文件呢


我在Stackoverflow中搜索了不同的帖子,但找不到我需要的。我读到zip条目不能删除,但是替换它怎么样?请帮助

您的问题是新文件可能比旧文件大,或者更小!您需要完全按照您所做的来允许更改。新文件ZIPped与前一个文件大小完全相同的可能性几乎为零。

您的问题是新文件可能比旧文件大,或者更小!您需要完全按照您所做的来允许更改。新文件ZIPped与前一个文件大小完全相同的可能性几乎为零。

标准Java ZIP文件库不允许您更新现有的ZIP文件。您需要使用第三方库。谷歌搜索应该会为你找到很多选择

但你需要注意以下几点:

  • 如果你的申请。。。或系统。。。更新ZIP文件时崩溃,文件可能已损坏

  • 更新ZIP文件时,文件的替换版本将附加到ZIP。旧版本的仍将处于压缩状态。。。但不在ZIP文件索引中。因此,更新ZIP文件(不重写)会浪费磁盘空间


标准Java ZIP文件库不允许您更新现有的ZIP文件。您需要使用第三方库。谷歌搜索应该会为你找到很多选择

但你需要注意以下几点:

  • 如果你的申请。。。或系统。。。更新ZIP文件时崩溃,文件可能已损坏

  • 更新ZIP文件时,文件的替换版本将附加到ZIP。旧版本的仍将处于压缩状态。。。但不在ZIP文件索引中。因此,更新ZIP文件(不重写)会浪费磁盘空间


是,我要替换的文件的大小与字节大小不同。但是,是的,差别将会存在。那么我该如何替换它呢?你的意思是说我们没有办法完全替换一个文件(因为大小总是不同的):复制文件中其余数据的代码“向上”以为更大的数据腾出空间比简单地替换更复杂:1)按照上面显示的做;2) 删除旧文件;3) 重命名新文件。我有5个配置文件,zip文件大小为170 MB,这意味着,创建5次zip文件,5 X 170 MB文件,因此创建、替换和重命名5次如此大的文件效率非常低。我同意你的看法-因此,为什么不改为将上述函数更改为
replaceConfigurationFile*s*
,传入要替换的文件数组,然后与
if
测试中的所有名称进行比较?只需要创建一个新的ZIP文件,并替换所有5个配置文件。是的,要替换的我的文件具有不同的大小(以字节为单位)。但是,是的,差别将会存在。那么我该如何替换它呢?你的意思是说我们没有办法完全替换一个文件(因为大小总是不同的):复制文件中其余数据的代码“向上”以为更大的数据腾出空间比简单地替换更复杂:1)按照上面显示的做;2) 删除旧文件;3) 重命名新文件。我有5个配置文件,zip文件大小为170 MB,这意味着,创建5次zip文件,5 X 170 MB文件,因此创建、替换和重命名5次如此大的文件效率非常低。我同意你的看法-因此,为什么不改为将上述函数更改为
replaceConfigurationFile*s*
,传入要替换的文件数组,然后与
if
测试中的所有名称进行比较?只需要创建一个新的ZIP文件,并替换所有5个配置文件。当然,谢谢,你知道这样的库吗?你能推荐吗?我不能推荐任何图书馆。但是你可以用谷歌找到它们。我发现一个并不能完全解决我的问题,但是我可以让它工作。谢谢你的建议。谢谢,你知道有这样的库吗?你能推荐吗?我不能推荐任何图书馆。但是你可以用谷歌找到它们。我发现一个并不能完全解决我的问题,但是我可以让它工作,谢谢你的建议
 D:/app-dev.yml