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

时间:2010-11-09 07:04:52

标签: java unix named-pipes

我有两个问题

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

进程p = Runtime.getRuntime()。exec(命令);

cat alias>偏见

2)如何从java读取和写入来自unix管道的稳定数据流。 我是否必须进行所有系统调用,如打开读写管道

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

cat alias>偏见

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

3 个答案:

答案 0 :(得分:6)

从JDK 7开始,有一种方便的方法:

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

参考:ProcessBuilder#redirectOutput

答案 1 :(得分:3)

您可以像调用任何其他程序一样调用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的任何内容都通过管道传输到InputStreamp.getInputStream()分别获得的p.getErrorStream()

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

答案 2 :(得分:1)

你不能使用“>”直接在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)
  • 您必须消耗(至少关闭)所有流程(错误,输入,输出)。