4

重複の可能性:
Java を使用して zip ファイルにファイルを追加する

Java 開発者の皆様、こんにちは。

シナリオ

は次のとおりです。という名前のテキストファイルがあるとしsample.txtます。私が実際にやりたいことは、ファイルをという名前のsample.txtファイルに入れることです。 これが私がこれまでに学んだことです。*.zipTextFiles.zip

try{
    File f = new File(compProperty.getZIP_OUTPUT_PATH());
    zipOut = new ZipOutputStream(new FileOutputStream(f));
    ZipEntry zipEntry = new ZipEntry("sample.txt");
    zipOut.putNextEntry(zipEntry);
    zipOut.closeEntry();
    zipOut.close();
    System.out.println("Done");

} catch ( Exception e ){
    // My catch block
}

これまでの私のコードはファイルを作成し、*.zipファイルを挿入しsample.txtます。
私の質問は、作成したファイルに既存のファイルを挿入するにはどうすればよい*.zipですか?
あなたの回答がTrueZIP と関係がある場合は、SSCCEを投稿してください。

私は次のことをしました:

  • ググった
  • 既存の質問を検索します。(いくつか見つかりました。答えはありません。私の特定の質問に答えなかった人もいました。
  • TrueZipをお読みください。それでも、私は何も理解できませんでした。(ご理解ください)
4

3 に答える 3

8

組み込みの Java API を使用します。これにより、ファイルが Zip ファイルに追加されます。既存の Zip ファイルがあれば置き換えられ、新しい Zip ファイルが作成されます。

public class TestZip02 {

  public static void main(String[] args) {
    try {
      zip(new File("TextFiles.zip"), new File("sample.txt"));
    } catch (IOException ex) {
      ex.printStackTrace();
    }
  }

  public static void zip(File zip, File file) throws IOException {
    ZipOutputStream zos = null;
    try {
      String name = file.getName();
      zos = new ZipOutputStream(new FileOutputStream(zip));

      ZipEntry entry = new ZipEntry(name);
      zos.putNextEntry(entry);

      FileInputStream fis = null;
      try {
        fis = new FileInputStream(file);
        byte[] byteBuffer = new byte[1024];
        int bytesRead = -1;
        while ((bytesRead = fis.read(byteBuffer)) != -1) {
          zos.write(byteBuffer, 0, bytesRead);
        }
        zos.flush();
      } finally {
        try {
          fis.close();
        } catch (Exception e) {
        }
      }
      zos.closeEntry();

      zos.flush();
    } finally {
      try {
        zos.close();
      } catch (Exception e) {
      }
    }
  }
}
于 2013-01-16T03:17:29.160 に答える
3

ここで質問に対する回答を得ることができます: http://truezip.schlichtherle.de/2011/07/26/appending-to-zip-files/

于 2013-01-16T03:10:52.423 に答える
1

壮大な JDK リファレンスによると、ループを使用しwhile zis.getNextEntry() != nullてファイルをループし (zis は ZipInputStream です)、次に使用zis.read()して配列に読み込み、それを ArrayList などに送信できるようです。

次に、このメソッドを使用して配列toArray()「キャスト」bytezos.write()し、出力 ZIP ファイル (zos はZipOutputStream)に「キャスト」してzos.putNextEntry()、新しいエントリを作成することができます。(ZipEntry を保存し、その名前をze.getName(), でzeあると取得する必要があります。)と(ループ本体以外のすべての場所で使用ZipEntry) に置き換える必要Tがあり、 (ラッパー クラス)から に変換するために使用するキャスト コードを変更する必要がある場合があります。 (プリミティブ型)、次のように:BytebytebyteforByte.byteValue()Bytebyte

for(int i = 0; i < objects.length; i++) {
    convertedObjects[i] = (Byte)objects[i].byteValue();
}

これはテストされておらず、JDK (エントリZipInputStreamZipOutputStreamArrayList、およびByte) と配列キャストに関する Google 検索に基づいていることに注意してください。

それが少し濃かったら申し訳ありませんが、これが役に立てば幸いです!!

于 2013-01-16T03:04:13.173 に答える