gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 01:24:34 26 4
gpt4 key购买 nike

假设我有一个 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 方式来完成此任务?我知道有redirectOutput()redirectError()来自 ProcessBuilder 的方法,但我不认为我可以使用它们来重定向到 String

最佳答案

正如评论中所指出的,我错过了 redirectErrorStream(boolean)一种允许我在内部将 stderr 通过管道传输到 stdout 的方法,因此只需处理一个流。在这种情况下,使用 CompletableFuture 完全是矫枉过正(双关语无意......?),没有它我可能会过得更好。

关于java - 使用 Java 8 CompletableFuture 同时从 java.lang.Process 读取 stdout/stderr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29619082/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com