假设我有一个java.lang.Process process
对象,表示我想从Java开始的子进程。我需要将子流程中的stdout
和stderr
输出组合为单个String
,并且出于此问题的目的,我选择存储stdout
首先,然后是stderr
。根据我目前的理解,我应该同时阅读它们。对于CompletableFuture
来说,我认为这听起来像是一项很好的任务?
因此,我有以下代码片段:
获取输出
final CompletableFuture<String> output = fromStream(process.getInputStream()).thenCombine(
fromStream(process.getErrorStream()),
(stdout, stderr) -> Stream.concat(stdout, stderr).collect(Collectors.joining("\n")));
// to actually get the result, for example
System.out.println(output.get());
fromStream()
辅助方法
public static CompletableFuture<Stream<String>> fromStream(final InputStream stream) {
return CompletableFuture.supplyAsync(() -> {
return new BufferedReader(new InputStreamReader(stream)).lines();
});
}
有没有更好/更好的Java-8方式来完成这项任务?我了解ProcessBuilder
中有redirectOutput()
和redirectError()
方法,但我不认为我可以将它们重定向到String
?
答案 0 :(得分:1)
正如评论中指出的那样,我错过了允许我在内部将stderr
传递给stdout
的{{3}}方法,因此只有一个流可以处理。在这种情况下,使用CompletableFuture
是完全矫枉过正(双关语......),如果没有它,我可能会更好。