从 java 程序调用 unix shell?从 java 程序中向 unix 管道读取和写入稳定的数据流

Posted

技术标签:

【中文标题】从 java 程序调用 unix shell?从 java 程序中向 unix 管道读取和写入稳定的数据流【英文标题】:Invoke a unix shell from java program?read and write a steady stream of data to and from a unix pipe from java program 【发布时间】:2010-11-09 07:04:51 【问题描述】:

我有 2 个问题

1) 我如何从 java.runtime 库中调用 unix shell 来运行这样的命令

进程 p = Runtime.getRuntime().exec(commands);

猫别名>偏见

2) 我怎样才能从 java 中读取和写入 unix 管道的稳定数据流。 我是否必须对管道进行所有系统调用,例如打开读写操作

我基本上是想复制这个命令

猫别名>偏见

稳定的数据流将来自java程序的bias而不是cat别名。

【问题讨论】:

你可以试试看javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html 【参考方案1】:

从JDK7开始,有一种方便的方式来做到这一点:

ProcessBuilder pb = new ProcessBuilder("cat", "alias");
File bias = new File("bias");
pb.redirectOutput(Redirect.appendTo(bias));
pb.start();

参考:ProcessBuilder#redirectOutput

【讨论】:

【参考方案2】:

您可以像调用任何其他程序一样调用 Unix shell。使用-c 选项将要运行的命令作为参数传递。还要确保使用exec(String[]) 方法,而不是exec(String),以避免命令被错误地标记:

String[] cmd = "/bin/sh", "-c", "/bin/cat alias > bias";
Process p = Runtime.getRuntime().exec(cmd);

要读取/写入进程,请从您刚刚创建的Process 实例中获取输入、输出和错误流:

InputStream in = p.getInputStream();
InputStream err = p.getErrorStream();
OutputStream out = p.getOutputStream();

然后像往常一样读取/写入这些流。

请注意,流是相对于 Java 应用程序命名的。写入OutputStream 的任何内容都会通过管道传输到您创建的进程的标准输入。进程写入 stdout/stderr 的任何内容都通过管道传输到分别从 p.getInputStream()p.getErrorStream() 获得的 InputStreams。

参考:http://download.oracle.com/javase/6/docs/api/java/lang/Process.html

【讨论】:

【参考方案3】:

您不能在 Runtime.exec() 命令中直接使用“>”。它不会产生预期的效果,并且不会将输出重定向到文件。

你必须得到你进程的输入流并将其重定向到要写入的文件:

Process p = Runtime.getRuntime().exec(new String[] "cat", "alias");
InputStream in = p.getInputStream();
FileOutputStream fos = new FileOutputStream("yourFile");
// Write in into fos...
// handle the process streams

具体写法我就不细说了:

您必须处理异常 (IO) 您必须消耗(至少要关闭)所有流程流(错误、输入、输出)。

【讨论】:

“你不能在 Runtime.exec() 命令中使用 ">"”:是的,你可以。为什么你认为你做不到? @Grodriguez:我相信他想解释一下,如果你将“>”放入 Runtime.exec() 命令中,它将不会产生在 Unix shell 中的效果。当然,您可以将 ">" 用作常规字符,或者像在您的答案中那样调用 /bin/sh 并将 ">" 传递给它。 如果他是这个意思,他应该这么说。让我们不要再猜测吧? @Benoit:它具有与在 Unix shell 中相同的效果,只要您实际在 Runtime.exec() 中执行 Unix shell。 是的,但是在我的示例代码中,我不执行 Unix shell,而只执行“cat”命令。因此,为了重定向输出,我需要使用流程流。如果可以的话,我更喜欢使用 java 的东西而不是系统的东西。

以上是关于从 java 程序调用 unix shell?从 java 程序中向 unix 管道读取和写入稳定的数据流的主要内容,如果未能解决你的问题,请参考以下文章

Unix shell 脚本和 PLSQL

java调用shell脚本,并得到shell脚本的返回值

Unix Tutorial Eight

iOS App从点击到启动

如何从 Java 调用 Linux shell 命令

如何从 Java 调用 Linux shell 命令