java - ProcessBuilder:如果没有 "redirectOutput",进程就无法完成

标签 java java-8 process processbuilder

我正在使用 Java 自动化 gradle 构建。我在从 ProcessBuilder 创建的进程中执行“gradlew.bat”。代码如下:

ProcessBuilder gradlewProcessBuilder = new ProcessBuilder(mainDirPath.concat("\\android\\gradlew.bat"), "assembleDebug");
gradlewProcessBuilder.directory(new File(mainDirPath.concat("/android")));
gradlewProcessBuilder.redirectOutput(ProcessBuilder.Redirect.INHERIT); //This is the line
Process gradlewProcess = gradlewProcessBuilder.start();
gradlewProcess.waitFor();

现在这段代码可以完美运行,但它通过应用程序控制台输出 gradle 控制台,我不希望这样。如果我删除这一行:

gradlewProcessBuilder.redirectOutput(ProcessBuilder.Redirect.INHERIT);

进程无限期地卡在 waitFor() 中。

我完全不知道redirectOutput如何对此产生影响,欢迎您提供任何信息。

最佳答案

如果输出未重定向或处理,则分配默认输出缓冲区。然而,在 Windows 上,输出缓冲区非常小;当它填满时,应用程序将停止执行并阻塞,直到输出缓冲区耗尽。

因此,您需要以某种方式耗尽输出;通过使用 INHERIT 或通过使用耗尽输出的线程。我建议使用https://github.com/zeroturnaround/zt-exec因为它有更好的默认处理。

关于java - ProcessBuilder:如果没有 "redirectOutput",进程就无法完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53215216/

相关文章:

Java regex - 从匹配文本中获取行号

java - 如何迭代对象数组列表并设置为java 8中的另一个对象列表?

java - 启动Firefox并等待其关闭

c++ - 运行时进程内存修补以恢复状态

c - 本应处于 sleep 状态的进程处于事件状态

java - 在文件输入输出java中使用数组列表

java - 使用 Java 读取 Excel 工作表时出错

java - onCreate 中设置的属性,导致 onResume 中出现 NullPointer

asynchronous - 如何从异步 Http 客户端请求获取 CompletableFuture<T>?

java - 带有泛型的 lambda 类型检测不正确