我有两个问题
1)如何从java.runtime库调用unix shell来运行这样的命令
进程p = Runtime.getRuntime()。exec(命令);
cat alias>偏见
2)如何从java读取和写入来自unix管道的稳定数据流。 我是否必须进行所有系统调用,如打开读写管道
我基本上想要复制这个命令
cat alias>偏见
其中稳定的数据流将来自java程序,而不是cat别名。
答案 0 :(得分:6)
从JDK 7开始,有一种方便的方法:
ProcessBuilder pb = new ProcessBuilder("cat", "alias");
File bias = new File("bias");
pb.redirectOutput(Redirect.appendTo(bias));
pb.start();
答案 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的任何内容都通过管道传输到InputStream
和p.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
我没有详细说明写作方法,但是: