我尝试使用下面的代码来执行从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工作正常,它执行并显示该文件已复制成功。 请谁能告诉我为什么发生这种情况?
你需要清理的第一个进程的流,否则程序将阻止,因为“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);