inputstreamreader本身不执行linux管道命令,仅将process的标准输出字节流按指定编码(如utf-8)转为字符流;真正执行需通过runtime.exec()或processbuilder调用/bin/sh -c,并须同时处理stderr和退出码。

Java 中 InputStreamReader 本身不直接执行 Linux 管道命令,它只是将字节流(InputStream)按指定字符编码转换为字符流。真正执行管道命令的是 Process,而 InputStreamReader 负责读取该进程的标准输出流(Process.getInputStream())并解码为字符串。
获取管道命令的输出流
先用 Runtime.exec() 或 ProcessBuilder 启动带管道的 shell 命令(如 ls | grep java),注意必须显式调用 /bin/sh -c 才能支持管道语法:
-
错误写法:
Runtime.getRuntime().exec("ls | grep java")—— 这会把整个字符串当做一个可执行文件名,报IOException: Cannot run program "ls | grep java" -
正确写法:
Runtime.getRuntime().exec(new String[]{"/bin/sh", "-c", "ls | grep java"}) - 推荐用
ProcessBuilder更清晰:new ProcessBuilder("/bin/sh", "-c", "ps aux | head -5")
用 InputStreamReader 包装标准输出流
拿到 Process 后,调用 getInputStream() 获取其 stdout 字节流,再用 InputStreamReader 包装,并指定编码(Linux 终端通常为 UTF-8):
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 示例:
InputStreamReader reader = new InputStreamReader(process.getInputStream(), StandardCharsets.UTF_8); - 避免用无参构造器(默认使用平台编码,可能乱码)
- 建议配合
BufferedReader提高读取效率:BufferedReader br = new BufferedReader(reader);
安全读取并处理异常
管道命令可能出错(如命令不存在、权限不足),需同时读取 stderr 并等待进程结束:
- 用
process.waitFor()阻塞直到命令执行完成 - 检查退出码:
if (process.exitValue() != 0)表示执行失败 - 别忽略
stderr:用另一个InputStreamReader读取process.getErrorStream(),否则子进程可能因 stderr 缓冲区满而卡住 - 读取时加 try-with-resources 自动关闭流,防止资源泄漏
完整可运行示例
读取 date | cut -d' ' -f1,2,3 输出:
Process process = new ProcessBuilder("/bin/sh", "-c", "date | cut -d' ' -f1,2,3").start();
try (InputStreamReader isr = new InputStreamReader(process.getInputStream(), StandardCharsets.UTF_8);
BufferedReader br = new BufferedReader(isr)) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
}
process.waitFor(); // 等待命令结束
if (process.exitValue() != 0) {
System.err.println("命令执行失败,退出码:" + process.exitValue());
}
不复杂但容易忽略编码和 stderr 处理,这两点不到位就容易乱码或阻塞。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










