【问题标题】:How stream json content from jackson to org.apache.http.entity.InputStreamEntity?如何将 json 内容从 jackson 流式传输到 org.apache.http.entity.InputStreamEntity?
【发布时间】:2018-03-10 08:26:14
【问题描述】:

我正在尝试将带有 base64 的 json 流式传输到使用 Appache HttpComponents 的 elasticsearch(据我所知)。

对于 json 流,我创建了 JsonGenerator,但它需要“一些”OutputStream。要通过 Jest 发送请求,需要从“一些”InputStream 创建InputStreamEntity。所以JsonGenerator 需要用于写入的流和InputStreamEntity 用于读取的流(unknowOutputStreamunknowInputStream 变量)。流(据我所知)应该是相同的 - 但如何创建它?

乍一看,我可以使用ByteArrayInputStream 之类的东西,但这样我就松了流,因为它会将内容填充到byte[] 中,因此所有流数据都将存储到内存中。如何创建一个只存储一条数据的流,直到读取该数据。然后再持有另一条数据?

import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonGenerator;
import org.apache.http.HttpHost;
import org.apache.http.entity.InputStreamEntity;
import org.elasticsearch.client.RestClient;

import java.io.DataOutput;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Arrays;
import java.util.Collections;

public class Exmaple {
    public static void main (String[] args) throws Exception {
        final InputStream inputStream;
        final int size;

        RestClient restClient = RestClient.builder(new HttpHost("myHost", 443, "https")).build();

        final OutputStream unknowOutputStream;
        final InputStream unknowInputStream;


        final JsonGenerator generator = new JsonFactory().createGenerator(unknowOutputStream);
        generator.writeStartObject();
        generator.writeFieldName("content");
        generator.writeBinary(inputStream, size);
        generator.writeEndObject();


        restClient.performRequest(
                "POST",
                "somepath",
                Collections.emptyMap(), new InputStreamEntity(unknowInputStream));
    }
}

【问题讨论】:

    标签: java json stream inputstream outputstream


    【解决方案1】:

    可能有一个使用 JDK 中的 PipedInputStream / PipedOutputStream 的解决方案,但我想在 HTTPClient 的 API 中从 InputStreamEntity 切换到 EntityTemplate 会更简单。

    EntityTemplate 是与ContentProducer 一起使用的HTTP 实体,ContentProducer 的唯一方法是writeTo(OutputStream)。这样,您就不必桥接输入和输出流。

    new EntityTemplate(new ContentProducer(
        (outputStream) -> {
            final JsonGenerator generator = new JsonFactory().createGenerator(outputStream);
            generator.write(...);
        }
    ));
    

    (您可能想要创建子类,正确处理异常,...而不是使用 lambda。为了简单起见,我使用了一个)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-13
      • 2015-10-07
      • 2019-01-03
      • 2019-07-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多