2016-06-11 8 views
1

私はzipファイルを持っています。その中にあるファイルを別のファイルに置きたいと思います。だから、zipエントリを削除する必要はありません。ただ、zipエントリのファイルを別のものに置き換えてください。Javaで解凍しないで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 
} 

は私が指定したファイルの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回、5つのX 170 MBファイルを作成するので、5つの大きなファイルを作成、置き換え、名前を変更することは非常に効率が悪いです。 –

2

標準のJava ZIPファイルライブラリでは、既存のZIPファイルを更新することはできません。サードパーティライブラリを使用する必要があります。 Google検索では、いくつかの選択肢があります。

しかし、あなたは物事のカップルに注意する必要があります。

  • ZIPファイルの更新中に、ファイルが壊れている可能性があり、アプリケーション...またはシステム...クラッシュした場合。

  • ZIPファイルが更新されると、そのファイルの置換バージョンがZIPに追加されます。 theの古いバージョンはまだZIPにありますが、ZIPファイルのインデックスにはありません。したがって、ZIPファイルを更新すると(書き換えずに)、ディスクスペースが無駄になります。

+0

確かに、あなたはそのようなライブラリを知っていますか?あなたはお勧めできますか? –

+0

ライブラリはお勧めできません。しかし、あなたはGoogleを使ってそれらを見つけることができます。 –

+0

https:// githubが見つかりました。com/zeroturnaround/zt-zip 私の問題を正確には解決していませんが、うん、私はそれを動作させることができます 提案をありがとう –

関連する問題