用Java执行外部程序

时间:2012-03-21 22:31:04

标签: java process runtime

我试图在java程序中运行“cut”,但是我在如何拆分命令数组方面迷失了。 我在命令行中的程序如下:

cut file.txt -d' ' -f1-2  > hits.txt

我正试图像这样在

中运行它
Runtime rt = Runtime.getRuntime();
Process pr = rt.exec(new String[]{"file.txt"," -d' ' -f1-2 "," > hits.txt"});
pr.waitFor();

但我收到以下运行时错误

Exception in thread "main" java.io.IOException: Cannot run program "cut file.txt": java.io.IOException: error=2, No such file or directory

我将此错误归因于我用作exec命令的字符串数组。关于如何做到这一点的任何想法?还有关于该问题的任何已知文档。感谢

2 个答案:

答案 0 :(得分:1)

如果您想要输出重定向,则必须自己完成。 > hits.txt不会做你想做的事。从exec调用的进程重定向stdout涵盖in another StackOverflow question

您显示的错误与您在此处列出的源代码不一致 - cut没有来源。它绝对试图将cut file.txt理解为单个可执行文件的完整相对路径,其名称中包含空格,这几乎肯定不是您想要的。使用正确的代码对此进行故障排除会更容易。

答案 1 :(得分:1)

为bash创建一个脚本:

"/bin/bash" "-c" "cut file.txt -d' ' -f1-2  > hits.txt"

或拆分

"cut" "file.txt" "-d" "' '" "-f" "1-2" 

错误消息清楚地表明:

Cannot run program "cut file.txt"

所以它将“cut file.txt”解释为一个内部空白的程序名。

您的问题始于重定向,因为您无法以这种方式重定向输出:

"cut" "file.txt" "-d" "' '" "-f" "1-2" ">" "hits.txt"

您必须处理输入和输出流。在Java中实现cut,获取可移植解决方案,或者调用用户可以在命令行或配置文件中指定的脚本,这样可以更好地适应Windows或其他平台。

调用/ bin / bash并重定向应该可以在unix之类的系统上运行。