Java 运行时问题

Java 运行时问题,java,runtime.exec,Java,Runtime.exec,如何在windows上执行此操作,未创建文件filename.txt Process p = Runtime.getRuntime().exec("cmd echo name > filename.txt"); 显然,预期的输出是一个“filename.txt”,应该创建内容为“name”的“C:\Documents and Settings\username\filename.txt” 即使没有使用processBuilder创建文件名为“filename.txt”,也可以使用以下代

如何在windows上执行此操作,未创建文件filename.txt

Process p = Runtime.getRuntime().exec("cmd echo name > filename.txt");
显然,预期的输出是一个“filename.txt”,应该创建内容为“name”的“C:\Documents and Settings\username\filename.txt”


即使没有使用processBuilder创建文件名为“filename.txt”,也可以使用以下代码进行管理

       Runtime runtime = Runtime.getRuntime();
       Process process = runtime.exec("cmd /c cleartool lsview");
       // Directly to file

//Process p = Runtime.getRuntime().exec( 
//              new String[] { "cmd", "/c", "cleartool lsview > filename.txt" },null, new File("C:/Documents and Settings/username/")); 

       InputStream is = process.getInputStream();
       InputStreamReader isr = new InputStreamReader(is);
       BufferedReader br = new BufferedReader(isr);
       String line;

       System.out.printf("Output of running %s is:", 
           Arrays.toString(args));

       while ((line = br.readLine()) != null) {
         System.out.println(line);
       }
或者,使用ProceeSBuilder

Process process = new ProcessBuilder( "cmd", "/c", "cleartool lsview" ).start();
InputStream is = process.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));

System.out.printf("Output of running %s is:", Arrays.toString(args));

String line;
while ((line = br.readLine()) != null) {
    System.out.println(line);
}
它应该与

Process p = Runtime.getRuntime().exec(
    new String[] { "cmd", "/c", "echo name > filename.txt" });
我目前没有运行Windows,所以很遗憾我无法测试它

这背后的原因是,在您的版本中,命令在每个空格字符处被拆分。因此,运行时所做的是创建一个进程
cmd
,并向它提供参数
echo
name
filename.txt
,这些参数毫无意义。命令
echo name>filename.txt
cmd
进程的一个参数,因此您必须手动提供一个包含不同参数的数组

如果要确保文件是在特定文件夹中创建的,则必须为
exec()
提供一个工作目录,该目录仅适用于三参数版本:

Process p = Runtime.getRuntime().exec(
    new String[] { "cmd", "/c", "echo name > filename.txt" },
    null, new File("C:/Documents and Settings/username/"));

实际上应该使用而不是
Runtime.exec
(请参阅)


(如果我有一台windows机器,我会将它改编成cmd和echo…请随意编辑这篇文章!)

它现在怎么不工作?以什么方式不工作?很明显?你是直接从'C:\Documents and Settings\username'文件夹运行它吗?你为什么要用cmd来运行它?你不能用
java.io.File
?你正在执行的命令会在我的机器上打开一个命令窗口。你是说
cmd/k echo name>filename.txt
?但这是一个依赖于平台的问题:)是的,波佐。我真的没有得到那个评论。如果你执行某件事情,它(几乎?)总是依赖于平台。这行得通吗?我认为
Runtime.exec
无法在
echo name>filename.txt
@tim中处理重定向,这就是为什么它是处理重定向的
cmd
的一个参数。不是
exec()
。请记住,
ProcessBuilder
是在JDK5中引入的。早期版本的JDK仍然需要
Runtime.exec(…)
。无论您使用
ProcessBuilder
还是
exec()
,问题的根源(传递在错误位置拆分的单个字符串)都是一样的。我实际需要的是“cmd cleartool lsview>views.txt”,命令cleartool lsview的execpect输出应转到views.txt文件。这在正常cmd提示符下工作正常。但在java程序中,我确实希望实现this@musiKk; 你说得对。我可以澄清一下,
您的_命令
可能对应于
cmd
,而
arg1
对应于
echo name
。但是,我没有一台windows机器可以测试这一点。(这就是为什么我说每个人都可以自由编辑帖子。)@srinanapa,try-to-do
newprocessbuilder(“cleartool”,“lsview”)在上述解决方案中。
ProcessBuilder pb = new ProcessBuilder("your_command", "arg1", "arg2");
pb.directory(new File("C:/Documents and Settings/username/"));

OutputStream out = new FileOutputStream("filename.txt");
InputStream in = pb.start().getInputStream();

byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) > 0)
    out.write(buf, 0, len);

out.close();