Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将对象写入json格式的zip文件_Java_Json_Gson_Writer_Zipoutputstream - Fatal编程技术网

Java 将对象写入json格式的zip文件

Java 将对象写入json格式的zip文件,java,json,gson,writer,zipoutputstream,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()); 但我希望避免将整个对象加载到单个字符串中。因此,我将压缩流包装到writer对象中: Writer writ

我的目标是以json格式将对象写入zip文件。最简单的方法是:

ZipOutputStream zip = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(zipFile)));
String json = gson.toJson(object);
zip.write(json.getBytes());
但我希望避免将整个对象加载到单个字符串中。因此,我将压缩流包装到writer对象中:

Writer writer = new OutputStreamWriter(zip);
然后我用下面的方式写下条目:

zip.putNextEntry(entry);
gson.toJson(content, writer);
writer.flush();
zip.closeEntry();
zip.flush();

它工作得很好,但是同时使用writer和zip对象看起来非常混乱。对于这个问题有更好的解决方案吗?

您可以使用Jackson使它更简单一些,它有直接写入
输出流的方法

ObjectMapper mapper = new ObjectMapper();
try (ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFile))){  
  out.putNextEntry(new ZipEntry("object.json"));
  mapper.writeValue(out, object);
}

您可以使用Jackson使它变得更简单,它有直接写入
输出流的方法

ObjectMapper mapper = new ObjectMapper();
try (ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFile))){  
  out.putNextEntry(new ZipEntry("object.json"));
  mapper.writeValue(out, object);
}

您可以在语句中声明一个或多个资源。比如说

try (
   ZipOutputStream zip = new ZipOutputStream(new BufferedOutputStream(new 
   FileOutputStream(zipFile)));
   Writer writer = new OutputStreamWriter(zip);
) {
   zip.putNextEntry(entry);
   gson.toJson(content, writer);
}
按此顺序自动调用close方法。请注意,资源的close方法的调用顺序与其创建顺序相反。关于冲水

公共抽象void close()引发IOException


关闭流,首先冲洗流。一旦关闭流,进一步的write()或flush()调用将导致抛出IOException。关闭以前关闭的流无效。

您可以在语句中声明一个或多个资源。比如说

try (
   ZipOutputStream zip = new ZipOutputStream(new BufferedOutputStream(new 
   FileOutputStream(zipFile)));
   Writer writer = new OutputStreamWriter(zip);
) {
   zip.putNextEntry(entry);
   gson.toJson(content, writer);
}
按此顺序自动调用close方法。请注意,资源的close方法的调用顺序与其创建顺序相反。关于冲水

公共抽象void close()引发IOException


关闭流,首先冲洗流。一旦关闭流,进一步的write()或flush()调用将导致抛出IOException。关闭以前关闭的流没有效果。

那么你的问题是什么?对不起,我无意中发布了一篇未完成的文章。现在问题应该清楚了。假设json是默认的UTF-8,使用
Writer Writer=newoutputStreamWriter(zip,StandardCharsets.UTF_8)。为了连贯性,我会在putNextEntry之后创建作者。但从原则上讲,该准则确实是可行的;writer不应该在zip之前关闭,因为它会过早地关闭zip。我根本不会称之为“凌乱”。绝对正常。那你的问题是什么?对不起,我无意中发表了一篇未完成的文章。现在问题应该清楚了。假设json是默认的UTF-8,使用
Writer Writer=newoutputStreamWriter(zip,StandardCharsets.UTF_8)。为了连贯性,我会在putNextEntry之后创建作者。但从原则上讲,该准则确实是可行的;writer不应该在zip之前关闭,因为它会过早地关闭zip。我根本不会称之为“凌乱”。绝对正常。