含まれている各ファイルがいくつかのオブジェクトをシリアル化することによって生成される Java で zip アーカイブを作成したいと考えています。ストリームを正しく閉じるのに問題があります。
コードは次のようになります。
try (OutputStream os = new FileOutputStream(file);
ZipOutputStream zos = new ZipOutputStream(os);) {
ZipEntry ze;
ObjectOutputStream oos;
ze = new ZipEntry("file1");
zos.putNextEntry(ze); // start first file in zip archive
oos = new ObjectOutputStream(zos);
oos.writeObject(obj1a);
oos.writeObject(obj1b);
// I want to close oos here without closing zos
zos.closeEntry(); // end first file in zip archive
ze = new ZipEntry("file2");
zos.putNextEntry(ze); // start second file in zip archive
oos = new ObjectOutputStream(zos);
oos.writeObject(obj2a);
oos.writeObject(obj2b);
// And here again
zos.closeEntry(); // end second file in zip archive
}
もちろん、使い終わったら各ストリームを閉じる必要があることはわかっているのでObjectOutputStream
、指定された位置で s を閉じる必要があります。ただし、 を閉じると、まだ必要なObjectOutputStream
も閉じます。ZipOutputStream
への呼び出しを省略したくありません。なぜなら、現在はand をObjectOutputStream.close()
超えていないという事実に依存したくないからです。flush()
reset()
また、単一のObjectOutputStream
インスタンスを使用することもできません。これは、コンストラクターによって書き込まれたストリーム ヘッダーを見逃すためです (zip アーカイブ内の各ファイルは完全なオブジェクトのシリアル化ファイルではなく、個別に逆シリアル化できませんでした)。
ファイルを再度読み込むと、同じ問題が発生します。
私が見る唯一の方法は、に渡す前をZipOutputStream
除いてすべてのメソッドを転送するある種の「CloseProtectionOutputStream」でラップすることです。しかし、これはかなりハッキリしているようで、API でより優れたソリューションを見逃していたのではないかと思います。close()
ObjectOutputStream