Java Runtime.getRuntime().exec 无法捕获所有输出

标签 java

我的 shell 脚本 run.sh

echo "Running my.r"
Rscript /opt/myproject/my.r

从命令行输出run.sh

Running my.r
2019-06-14 job starts at 2019-06-13 16:52:21
========================================================================
1. Load parameters from csv files.
Error in file(file, "rt") : cannot open the connection
Calls: automation.engine ... %>% -> eval -> eval -> read.csv -> read.table -> file
In addition: Warning message:
In file(file, "rt") :
  cannot open file '/...../_nodes.csv': No such file or directory

但是我的Java程序只能捕获第一行“Running my.r”。如何捕捉输出的每一行?下面是我的Java代码:

Process proc = Runtime.getRuntime().exec("/opt/myproject/run.sh");
            BufferedReader read = new BufferedReader(new InputStreamReader(
                    proc.getInputStream()));
            try {
                proc.waitFor();
            } catch (InterruptedException e) {
                e.printStackTrace();
                throw e;
            }
            while (read.ready()) {
                String line = new String(read.readLine());
                results += "\r\n" + line;
                System.out.println(line);
            }

最佳答案

这是因为您仅从 Process#getInputStream 捕获标准输出(如 System.out),错误会打印在错误流中(System.err )。您还必须捕获Process#getErrorStream()

您可以使用 ProcessBuilder 而不是 Runtime.exec(),然后在其上调用 redirectErrorStream 来合并这两个流。

https://docs.oracle.com/javase/7/docs/api/java/lang/ProcessBuilder.html#redirectErrorStream()

关于Java Runtime.getRuntime().exec 无法捕获所有输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56585441/

相关文章:

java - 不同年份的两个日期之间的差异

java - AuthenticationProvider 和 AbstractUserDetailsAuthenticationProvider 之间的区别

java - 如何从 arrayList 中删除一项

java - 将字符串时间转换为本地时间以进行比较

java - 如何使用 JavaScript 更新我的 JSP 页面的某些组件

Java HttpClient 获取 url 中含有非法字符的响应

java - Oauth2 protected 资源

java - 在 yaml 上更改并坚持使用 @Value 注释的属性的更改

java - 带时间间隔的动态按钮

java - 使用 API key 和 secret 保护 Spring Boot API