2016-06-11 66 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 並不完全解決我的問題,不過是的,我可以讓它工作 感謝您的建議 –