如何执行多个命令窗口中使用的Java Runtime类(How to execute multipl

2019-10-16 21:50发布

我尝试使用下面的代码来执行从Java窗口的命令,

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

它似乎并没有工作。 如果我注释掉第一工艺管线(IE进程P)那么该过程P1工作正常,它执行并显示该文件已复制成功。 请谁能告诉我为什么发生这种情况?

Answer 1:

你需要清理的第一个进程的流,否则程序将阻止,因为“wget的”过程中产生的,它永远不会在你的当前实现读取输出。 你需要理清的第一个进程的输出和错误流。 再看答案,例如关于Java运行时,EXEC另一个问题上的SO 。

下面的代码适用于参照,而是依赖于产生的wget输出到stderr和PSCP到stdout的事实。 如果有什么事情得到输出到其他相应的流,代码工作,只要输出适合Java程序的缓冲区(请注意,这些缓冲区的大小往往是因平台不同),而它清空第一个流。 如果缓冲区满,命令只是块的执行。 您应该创建两个,粗壮和标准错误读取的过程中适当的流一个单独的线程。

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


文章来源: How to execute multiple windows commands using Runtime class in java