【发布时间】:2018-03-10 08:26:14
【问题描述】:
我正在尝试将带有 base64 的 json 流式传输到使用 Appache HttpComponents 的 elasticsearch(据我所知)。
对于 json 流,我创建了 JsonGenerator,但它需要“一些”OutputStream。要通过 Jest 发送请求,需要从“一些”InputStream 创建InputStreamEntity。所以JsonGenerator 需要用于写入的流和InputStreamEntity 用于读取的流(unknowOutputStream 和unknowInputStream 变量)。流(据我所知)应该是相同的 - 但如何创建它?
乍一看,我可以使用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