2016-06-11 38 views
1

我有一个zip文件,我想用另一个文件替换它里面的一个文件。因此,不需要删除zip条目,只需将zip条目的文件替换为另一个条目即可。替换一个Zip文件而不解压缩在Java

这是我试过的。

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 
} 

我有一个名为文件ZIP条目:

WEB-INF/classes/config/app-dev.yml 

,我必须在位置

D:/app-dev.yml 

在位置d驱动器中的文件,我能够在文件中复制到通过替换我想要替换的文件来创建不同的zip文件。但这真的不需要(创建一个不同的文件)。 那么我应该怎么做才能用我的自定义文件替换文件。

我已经在Stackoverflow中搜索过不同的帖子,但无法找到我需要的东西。我读过这个zip条目不能被删除,但是替换它呢?请帮忙

回答

2

你的问题是新文件可能比旧文件大 - 或者更小!您需要按照您所做的来做出更改。新文件ZIPped为刚好与前一个文件大小相同的概率几乎为零。

+0

是的我的文件被替换有不同的字节大小。但是,差异将在那里。 那我该如何取代它?你的意思是说我们无法替换文件(因为文件的大小总是不一样) –

+0

准确地说:将文件中其余数据复制到“上”以便为更大数据腾出空间的代码是比简单更复杂:1)做你以上显示的; 2)删除旧文件; 3)重命名新文件。 –

+0

我有5个配置文件,并且zip文件大小为170 MB,所以这意味着创建一个zip文件五次,5 X 170 MB文件,因此创建,替换和重命名5次这样的大文件效率非常低 –

2

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

但是你需要知道两件事情的:

  • 如果您的应用程序...或...系统崩溃,同时更新的ZIP文件,该文件可能已损坏。

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

+0

当然,谢谢,你知道任何这样的图书馆?你能建议吗? –

+0

我不能推荐任何图书馆。但是你可以使用Google找到它们。 –

+0

我找到了一个https:// github。COM/zeroturnaround/ZT-ZIP 并不完全解决我的问题,不过是的,我可以让它工作 感谢您的建议 –