2012-03-21 105 views
1

我试图在java程序中运行“剪切”,但是我失去了如何分割命令数组的问题。 我在命令行程序如下:在Java中执行外部程序

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(); 

运行Java里面,但我得到以下运行时错误

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

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

+0

'pr2'和'rt2'?请修正你的变量名称。 – 2012-03-21 22:36:13

+0

它看起来好像运行java进程的用户没有文件'file.txt'的权限,或者更有可能的是,file.txt与您运行java进程的位置不在同一个目录中。您可以更正相对路径或切换到绝对路径。 – Brad 2012-03-21 22:36:20

+2

这是确切的代码?不应该切入命令数组中吗? – 2012-03-21 22:38:57

回答

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" 

所以它解释 “切file.txt的” 如一个空白的程序名。

您的问题重定向开始,因为你不能重定向输出这种方式:

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

你必须处理输入和输出流。在Java中实现cut,获得可移植的解决方案或调用用户可能在命令行或配置文件中指定的脚本可能会更好,因此它可以适用于Windows或其他平台。

调用/斌/ bash和重定向那里应该工作 - 在unix像系统。

+0

“-c”是做什么的? – 2012-03-22 15:39:03

+1

@JulioDiaz:'-c'的意思是,这里有一个命令。见'bash --help'。该命令是第三个字符串,它由bash作为整个脚本进行解析。 – 2012-03-22 20:09:19

1

如果你想要输出重定向,你必须自己做。 > hits.txt不会做你想做的。从exec调用的过程重定向标准输出包含in another StackOverflow question

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