我想找到一种最聪明的方法来创建一个InputStream
来自Java库Jackson的JsonNode
。
直到现在我已经完成了:
IOUtils.toInputStream(jsonNode.toString());
但是这样可以在创建JsonNode
之前将String
转换为InputStream
。
不需要:
org.apache.http.entity.InputStreamEntity entity = new InputStreamEntity(IOUtils.toInputStream(jsonNode.toString()));
答案 0 :(得分:0)
在大多数情况下,如果使用ObjectMapper直接生成字节数组,JSON将写为UTF-8并且可以节省一些内存。
ObjectMapper objectMapper = new ObjectMapper();
JsonNode json = ...;
byte[] bytes = objectMapper.writeValueAsBytes(json);
具体来说,Apache HTTP客户端提供ByteArrayEntity以用于字节数组。对于其他用途,有一个ByteArrayInputStream。
当然,ObjectMapper只应创建一次并重复使用。
如果您真的希望以流方式编写JSON,可以使用一对PipedInputStream和PipedOutputStream,但是,如JavaDoc所述
通常,一个线程从
PipedInputStream
对象读取数据,并且某些其他线程将数据写入相应的PipedOutputStream
。建议不要尝试使用单个线程中的两个对象,因为它可能使线程死锁。
示例:
ObjectMapper objectMapper = new ObjectMapper();
JsonNode json = ...;
PipedInputStream in = new PipedInputStream();
new Thread(() -> {
try {
IOUtils.copy(in, System.out);
} catch (IOException e) {
...
}
}).start();
try (
PipedOutputStream out = new PipedOutputStream(in);
JsonGenerator gen = objectMapper.getFactory().createGenerator(out);
) {
gen.writeTree(json);
} catch (IOException e) {
...
}