使用Java 8 CompletableFuture从java.lang.Process同时读取stdout / stderr?

时间:2015-04-14 04:15:31

标签: java java-8 io-redirection

假设我有一个java.lang.Process process对象,表示我想从Java开始的子进程。我需要将子流程中的stdoutstderr输出组合为单个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

1 个答案:

答案 0 :(得分:1)

正如评论中指出的那样,我错过了允许我在内部将stderr传递给stdout的{​​{3}}方法,因此只有一个流可以处理。在这种情况下,使用CompletableFuture是完全矫枉过正(双关语......),如果没有它,我可能会更好。