首页 > Java > java教程 > 为什么 Java 的 `Runtime.exec()` 使用管道会产生意外的结果?

为什么 Java 的 `Runtime.exec()` 使用管道会产生意外的结果?

Barbara Streisand
发布: 2024-12-12 12:29:24
原创
543 人浏览过

Why Does Java's `Runtime.exec()` Produce Unexpected Results with Pipes?

Java 中的管道和 Runtime.exec()

考虑以下 Java 代码:

String commandf = "ls /etc | grep release";

try {
    Process child = Runtime.getRuntime().exec(commandf);
    child.waitFor();
    InputStream i = child.getInputStream();
    byte[] b = new byte[16];
    i.read(b, 0, b.length);
    System.out.println(new String(b));
} catch (IOException e) {
    e.printStackTrace();
    System.exit(-1);
}
登录后复制

程序的输出是:

/etc:
adduser.co
登录后复制

但是,当从shell 中,它正确显示:

lsb-release
登录后复制

跨平台管道行为

正如问题中提到的,管道行为不是跨平台的。 Java 创建者无法保证管道在不同平台上一致工作。

替代解决方案

要解决此问题,请考虑以下选项:

  • 执行脚本:编写一个执行所需命令管道的脚本并执行该脚本而不是单独执行命令。
  • Shell 执行: 使用 sh 命令在 shell 环境中执行管道命令:
String[] cmd = {
  "/bin/sh",
  "-c",
  "ls /etc | grep release"
};

Process p = Runtime.getRuntime().exec(cmd);
登录后复制

以上是为什么 Java 的 `Runtime.exec()` 使用管道会产生意外的结果?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板