从Java运行Echo

从Java运行Echo,java,windows,exec,Java,Windows,Exec,我正在试用Runtime.exec()方法来运行命令行进程 我编写了这个示例代码,它运行时没有问题,但不会在c:\tmp.txt处生成文件 String cmdLine = "echo foo > c:\\tmp.txt"; Runtime rt = Runtime.getRuntime(); Process pr = rt.exec(cmdLine); BufferedReader input = new BufferedReader(

我正在试用Runtime.exec()方法来运行命令行进程

我编写了这个示例代码,它运行时没有问题,但不会在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));
输出是

信息21-04 20:02:03024-Ran命令 'echo foo>c:\tmp.txt',获得退出代码 0,输出:foo>c:\tmp.txt


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


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

当在cmmand行中运行
echo
时,
由shell勇敢地执行,而创建文件的是shell

当您从Java使用它时,没有shell,并且该命令将其视为参数:

“foo>c:\tmp.txt”

(您可以从执行输出中确认)

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


如果要将输出重定向到文件,据我所知,唯一的方法是用Java打开文件,执行getInputStream,然后从进程的输入流中读取并写入所需的文件。

这不是问题,因为退出代码为0(表示成功),问题在于文件重定向(
)由shell/cmd.exe处理,因此不应用。但是解决方案仍然是一样的。