从Java运行Echo

问题描述:

我试着用Runtime.exec()方法来运行命令行进程。从Java运行Echo

我写了这个示例代码,它运行没有问题,但不会在c:\ tmp.txt中生成文件。

String cmdLine = "echo foo > c:\\tmp.txt"; 
Runtime rt = Runtime.getRuntime(); 
Process pr = rt.exec(cmdLine); 

BufferedReader input = new BufferedReader(
          new InputStreamReader(pr.getInputStream())); 
String line; 

StringBuilder output = new StringBuilder(); 
while ((line = input.readLine()) != null) { 
    output.append(line); 
} 

int exitVal = pr.waitFor(); 

logger.info(String.format("Ran command '%s', got exit code %d, output:\n%s", cmdLine, exitVal, output)); 

输出是

INFO 21-04 20:02:03024 - 然命令 '回响FOO> C:\ tmp.txt',得到了退出代码 0,输出:FOO > c:\ tmp.txt

echo不是Windows下的独立命令,而是嵌入在cmd.exe中。

我相信你需要调用像“cmd.exe/C echo ...”这样的命令。

+3

这不是问题,因为退出代码是0(意思是成功),问题是文件重定向('>')由shell/cmd.exe处理,因此不适用。然而,解决方案仍然是一样的。 – 2010-04-21 17:31:19

>由shell解释,当在cmmand行中运行echo,并且它是创建该文件的shell。

当你使用它与Java,没有外壳,以及命令看到的说法是:

"foo > c:\tmp.txt"

(可以确认,从执行输出)

你不能只是将“> c:\ tmp.txt”作为命令行的一部分传递给Runtime.exec以进行重定向。从Javadocs:“所有标准io(即stdin,stdout,stderr)操作将通过三个流(getOutputStream(),getInputStream(),getErrorStream())重定向到父进程。”

如果你想输出重定向到一个文件,给我所知,这样做将是打开的Java文件,做的getInputStream的唯一途径,然后从进程的输入流中读取和写入所需的文件。