【发布时间】:2020-10-22 19:32:18
【问题描述】:
我想要达到的目标:
我有一个启动 ngrok 的 JAVA 代码(ngrok 用于将您的本地端口公开给网络,以便其他人可以访问它。更多信息here)进程。现在使用Runtime.getRuntime() 生成新的 ngrok 进程后,我想读取它的输出。
问题:
当我尝试使用getInputStream() 和getErrorStream() 从InputStream 读取数据时,我的程序卡在了那里。所以我无法读取进程的输出。
代码:
Process ngrokProcess = Runtime.getRuntime().exec(" cmd /k start cmd /k \" ngrok http 8080 \" ");
String collect = Stream.of(ngrokProcess.getInputStream(), ngrokProcess.getErrorStream()).parallel().map((InputStream is) -> {
StringBuilder output = new StringBuilder();
try (BufferedReader br = new BufferedReader(new InputStreamReader(is))) {
String line;
while ((line = br.readLine()) != null) {
output.append(line);
output.append("\n");
}
} catch (IOException e) {
throw new RuntimeException(e);
}
return output;
}).collect(Collectors.joining());
我在这里做错了什么?或者有没有其他方法可以实现?
我不能等待进程完成,因为除非被强制终止,否则它永远不会结束。另外,我不能使用ProcessBuilder,因为用户看不到命令提示符(我在这里可能错了,需要调整一些东西才能看到。如果可能的话,请告诉我)。
如果需要更多信息,请告诉我。
提前致谢:)
【问题讨论】:
标签: java cmd process io processbuilder