2016-07-12 4 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); 
} 

私は簡単に私の処理機能をマッピングすることができ、その上にストリームに新しいJava 8 BufferedReader.lines()を使用しています。

まだ唯一欠けているのは、StreamStreamReader()です。これは、ストリームをReaderに変換することになっています。このストリームから、Apacheの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は実際には役に立ちません。専用のスレッド+バッファを必要とします。

関連する問題