2017-09-28 9 views
0

나는 (이해할 때) Appache HttpComponents을 사용하는 elasticsearch에 base64로 json을 스트리밍하려고합니다.jackson에서 org.apache.http.entity.InputStreamEntity로 스트림 json 콘텐츠를 가져 오는 방법은 무엇입니까?

json 스트림의 경우 JsonGenerator을 만들었지 만 "약간"OutputStream이 필요합니다. Jest를 통해 요청을 보내려면 InputStreamEntity을 "some"InputStream에서 생성해야합니다. 따라서 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)); 
    } 
} 

답변

1

는 JDK에서 PipedInputStream/PipedOutputStream 파이프를 사용하는 솔루션이있을 수 있습니다,하지만 난 당신이 HttpClient를의 API에 EntityTemplateInputStreamEntity에서 swicth하는 것이 더 간단 할 것 같아요.

EntityTemplateContentProducer과 작동하는 HTTP 엔터티이며 ContentProducer의 유일한 방법은 writeTo(OutputStream)입니다. 이런 식으로 입력 스트림과 출력 스트림을 연결할 필요가 없습니다.

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

(당신은 제대로, 서브 클래스를 생성 예외를 처리 할 수 ​​있습니다 ... 대신 람다를 사용. 나는 단순 하나 사용).

관련 문제