从 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()
获得的 InputStream
s。
参考: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 管道读取和写入稳定的数据流的主要内容,如果未能解决你的问题,请参考以下文章