我想在 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
s 也会关闭ZipOutputStream
我仍然需要的。
我不想省略对的调用,ObjectOutputStream.close()
因为我不想依赖它目前不超过flush()
and的事实reset()
。
我也不能使用单个ObjectOutputStream
实例,因为我错过了构造函数写入的流标头(zip 存档中的每个单个文件都不是完整的对象序列化文件,我无法独立反序列化它们)。
再次读取文件时会出现同样的问题。
我看到的唯一方法是将其包装ZipOutputStream
在某种“CloseProtectionOutputStream”中,它将转发所有方法,除非close()
在将其提供给ObjectOutputStream
. 但是,这似乎相当 hacky,我想知道我是否错过了 API 中更好的解决方案。