【问题标题】:How to execute multiple windows commands using Runtime class in java如何在java中使用Runtime类执行多个windows命令
【发布时间】:2012-06-24 18:42:00
【问题描述】:

我正在尝试使用以下代码从 Java 执行 windows 命令,

Process p=Runtime.getRuntime().exec("wget www.anyurl.com/index.html);

它可以工作,但是当我尝试执行另一个命令时,如下所示,

Process p1=Runtime.getRuntime().exec("pscp -pw sysadmin c:/mydirectory/mypage.html mahesh@vmstni01:/home/usr");

它似乎不起作用。如果我注释掉第一个进程行(即进程 p),那么进程 p1 工作正常,它执行并显示文件已成功复制。请问谁能告诉我为什么会这样?

【问题讨论】:

  • 定义“它不起作用”。会发生什么?
  • 是否必须完成第一个命令才能成功调用第二个命令?
  • 嗨 JB Nizet,第一个命令工作正常(即 wget),但是当我尝试执行 pscp 时它不起作用,如果我评论第一行(即 Process p=Runtime.getRuntime().exec( "wget www.anyurl.com/index.html); ) 然后 pscp 工作正常。
  • “它不起作用” 没有解释发生了什么。程序是否挂起?它会抛出异常吗?如果是这样,堆栈跟踪是什么?它做的事情是否超出了您的预期?如果是这样,您希望它做什么以及它会做什么?当你去看医生时,你不只是说:我病了。你说出所有的症状,帮助他找出问题所在。在这里做同样的事情。

标签: java runtime.exec


【解决方案1】:

您需要清理第一个进程的流,否则程序将阻塞,因为“wget”进程产生的输出在您当前的实现中永远不会读取。您需要整理出第一个流程的输出和错误流。查看例如的答案another question about java-runtime-exec on SO.

下面的代码仅供参考,但依赖于 wget 生成输出到 stderr 和 pscp 到 stdout 的事实。如果有任何东西输出到另一个相应的流,只要输出适合 Java 程序的缓冲区(请注意,这些缓冲区大小往往因平台而异),代码就会在清空第一个流时工作。如果缓冲区已满,则命令的执行只是阻塞。您应该为 stout 和 stderr 创建一个单独的线程,以读取相应的进程流。

    import java.io.BufferedReader;
    import java.io.InputStreamReader;

...

    Process p=Runtime.getRuntime().exec("wget http://www.duckduckgo.com/");

    BufferedReader perr=new BufferedReader(new InputStreamReader(p.getErrorStream()));
    BufferedReader pout=new BufferedReader(new InputStreamReader(p.getInputStream()));
    // We read stderror first from wget, because it spits the progress information into stderr
    for (String s=perr.readLine(); s!=null; s=perr.readLine())
    {
        System.out.println("Stderr from p: "+s);
    }
    for (String s=pout.readLine(); s!=null; s=pout.readLine())
    {
        System.out.println("Stdout from p: "+s);
    }
    // if you need to check whether the command actually returned normally
    int returnCode = p.waitFor();
    perr.close();
    pout.close();

    System.out.println("Returned from p with exit code "+returnCode);

    p=Runtime.getRuntime().exec("pscp -pw dontuseplainpwusesshkeys index.html user@10.0.0.11:");
    perr=new BufferedReader(new InputStreamReader(p.getErrorStream()));
    pout=new BufferedReader(new InputStreamReader(p.getInputStream()));
    // We read stdout of pscp first because pscp spits stuff into stdout.
    // The process will block if the buffer gets full and does not get emptied.
    for (String s=pout.readLine(); s!=null; s=pout.readLine())
    {
        System.out.println("Stdout from p: "+s);
    }
    for (String s=perr.readLine(); s!=null; s=perr.readLine())
    {
        System.out.println("Stderr from p: "+s);
    }

    int returnCode1 = p.waitFor();
    perr.close();
    pout.close();

    System.out.println("Process exited with return code "+returnCode1);

【讨论】:

  • 嗨大卫,第一个命令在第二个命令执行之前工作正常
  • 您好 jpe,我正在尝试您的建议并回复您。
  • 大家好,我在这里提供我的代码,请查看并告诉我这段代码有什么问题,String input;BufferedReader br; br = new BufferedReader(new InputStreamReader(System.in));输入=br.readLine(); if(input.equals("download")) { Process p=Runtime.getRuntime().exec("wget www.anyurl.com/index.html); } else if(input.equals("upload")) {进程 p1=Runtime.getRuntime().exec("pscp -pw sysadmin c:/mydirectory/mypage.html mahesh@vmstni01:/home/usr"); }
  • 看下面关于p.getInputStream()和p.getErrorStream()的帖子:stackoverflow.com/a/8597030/1424507
  • 请您修改我上面的代码并告诉我它的样子。我尝试了您的建议,但仍然没有成功。
猜你喜欢
  • 2021-09-09
  • 1970-01-01
  • 2020-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
相关资源
最近更新 更多