以json格式将对象写入zip文件

时间:2018-03-02 08:18:22

标签: java json gson writer zipoutputstream

我的目标是以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对象似乎非常混乱。这个问题有更好的解决方案吗?

2 个答案:

答案 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。关闭之前关闭的流无效。