2016-07-12 5 views
2

내 응용 프로그램의 일부에 InputStream이 주어지고 다른 InputStream을 생성하기 위해 일부 처리를 수행하려고합니다.java.util.stream.Stream을 <String>으로 java.io.Reader로 변환

try (
    final BufferedReader inputReader = new BufferedReader(new InputStreamReader(inputStream, UTF_8), BUFFER_SIZE); 
    final Stream<String> resultLineStream = inputReader.lines().map(lineProcessor::processLine); 
    final InputStream resultStream = new ReaderInputStream(new StringStreamReader(resultLineStream), UTF_8); 
) { 
    s3Client.putObject(targetBucket, s3File, resultStream, new ObjectMetadata()); 
} catch (IOException e) { 
    throw new RuntimeException("Exception", e); 
} 

은 내가 쉽게 내 처리 기능을 매핑 할 수가있는 스트림에 새로운 자바 8 BufferedReader.lines()을 사용하고 있습니다.

아직 부족한 것은 StringStreamReader() 클래스입니다.이 클래스는 내 스트림을 Apache로 변환하는 Reader로 변환해야합니다. commons-io : ReaderInputStream은 InputStream을 다시 생성 할 수 있습니다. (독자와 위로 우회 인코딩과 줄 바꿈을 처리하기 위해 합리적인 것 같다.)

은 매우 명확하게하기 위해, 위의 코드 그래서

public class StringStreamReader extends Reader { 
    public StringStreamReader(Stream<String> stringStream) { ... } 

    @Overwrite 
    public int read(char cbuf[], int off, int len) throws IOException { ... } 

    // possibly overwrite other methods to avoid bad performance or high resource-consumption 
} 

가정 등 StringStreamReader 클래스를 제공하고있는 도서관이있다? 아니면 사용자 정의 Reader 또는 InputStream 서브 클래스를 구현하지 않고 위의 응용 프로그램 코드를 작성하는 또 다른 방법이 있을까요?

+1

여기서 질문은 무엇입니까? – Frecklefoot

+0

나는 이해하지 못한다. 이미 문자열이 있습니다. 다른 문자 인코딩이 필요한 이유는 무엇입니까? –

+2

이것은 실제로 java.util.stream.Stream을 사용하는 방법이 아닙니다. –

답변

1

당신은 그런 일 할 수 있습니다

PipedWriter writer = new PipedWriter(); 
    PipedReader reader = new PipedReader(); 
    reader.connect(writer); 

    strings.stream().forEach(string -> { 
     try { 
      writer.write(string); 
      writer.write("\n"); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    }); 

을하지만 난 당신이 지연 처리의 형태를 원하는 것 같아요. 스트림 api 정말 도움이되지 않습니다, 당신은 할 전용 스레드 + 버퍼가 필요합니다.

관련 문제