java - 从 Linux 中用 Java 读取标准输出不起作用
问题描述
我正在尝试stdout
从我的简单 Linux shellscript 中读取。
test.sh
:
#!/bin/bash
echo "I am waiting"
sleep 2s
exit 0
ShellScriptExecutorTest.java
好像:
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
public class ShellScriptExecutorTest {
public static void main(String[] args) {
try {
ProcessBuilder processBuilder = new ProcessBuilder("sudo", "bash", "./test.sh");
processBuilder.directory(new File("/home/"));
processBuilder.inheritIO();
Process process = processBuilder.start();
InputStream is = process.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line;
while ((line = br.readLine()) != null) {
System.out.println("--> " + line);
}
int exitValue = process.waitFor();
System.err.println("exitValue: " + exitValue);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
如果我执行上面的代码,我会得到:
[root@localhost home]# javac ShellScriptExecutorTest.java
[root@localhost home]# java ShellScriptExecutorTest
I am waiting
exitValue: 0
所以,显然它BufferedReader
没有“读”任何东西,否则它写了:
--> I am waiting
在控制台上。
我怎样才能找出我的错误?
解决方案
删除此行
processBuilder.inheritIO();
查看它的作用:
public ProcessBuilder inheritIO()
Sets the source and destination for subprocess standard I/O to be the same as those of the current Java process.
取自这里java api
这正是您在控制台上看到的。您的子进程的控制台输出被“路由”到您的进程。
我不确定你想看什么?但是听起来您想查看子进程的 INPUT 吗?
底线是您需要对子进程和流有更基本的了解。
推荐阅读
- python - 应用于 Pandas 系列的 Json_normalize 在“str”和“int”实例之间返回“>”不支持
- spring-boot - 使用 DataSource 时获得过多的角色连接
- python - 带有自定义文件名的气流记录?
- oracle - oracle online recovery 不会改变归档的数据库
- c++ - CMake 包含/源路径有效配置
- java - 是否可以使用 Java 反射从注入的 DEX 中获取应用程序的类对象?
- python - 删除标点符号后从文本文件中打印唯一单词列表,并找到最长的单词
- ios - 为什么我的导航控制器的动画类型会发生变化?
- python - 二分搜索在我的 python 代码中不起作用
- linux - 如何将命令的输出获取到变量中?