将java.util.stream.Stream <string>转换为java.io.Reader

时间:2016-07-12 15:16:14

标签: java guava

我的应用程序的一部分被赋予了一个InputStream,并希望对此进行一些处理以生成另一个InputStream。

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()到Stream上,我可以轻松地映射我的处理函数。

唯一仍然缺少的是StringStreamReader()类,它应该将我的Stream变成一个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 个答案:

答案 0 :(得分: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并没有真正的帮助,你需要一个专用的Thread +一些缓冲区才能做到这一点。