我的目标是以json格式将对象写入zip文件。最简单的方法是:
ZipOutputStream zip = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(zipFile)));
String json = gson.toJson(object);
zip.write(json.getBytes());
但我想避免将整个对象加载到单个字符串中。所以我将一个zip流包装到一个writer对象中:
Writer writer = new OutputStreamWriter(zip);
然后我按照以下方式编写条目:
zip.putNextEntry(entry);
gson.toJson(content, writer);
writer.flush();
zip.closeEntry();
zip.flush();
它工作正常,但同时使用writer和zip对象似乎非常混乱。这个问题有更好的解决方案吗?
答案 0 :(得分:0)
你可以让Jackson更简单一些,它有直接写入OutputStream
的方法
ObjectMapper mapper = new ObjectMapper();
try (ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFile))){
out.putNextEntry(new ZipEntry("object.json"));
mapper.writeValue(out, object);
}
答案 1 :(得分:0)
您可以在try-with-resources语句中声明一个或多个资源。例如
try (
ZipOutputStream zip = new ZipOutputStream(new BufferedOutputStream(new
FileOutputStream(zipFile)));
Writer writer = new OutputStreamWriter(zip);
) {
zip.putNextEntry(entry);
gson.toJson(content, writer);
}
将按此顺序自动调用close方法。请注意,资源的close方法按其创建的相反顺序调用。关于flush,close flush it first。
public abstract void close()抛出IOException
关闭流,先冲洗它。关闭流后,进一步的write()或flush()调用将导致抛出IOException。关闭之前关闭的流无效。