java在企业级项目开发中,不管是强制性的功能须要,仍是为了简便java的实现,须要调用服务器命令脚原本执行。在java中,RunTime.getRuntime().exec()就实现了这个功能。
用法: public Process exec(String command)-----在单独的进程中执行指定的字符串命令。
public Process exec(String [] cmdArray)---在单独的进程中执行指定命令和变量
public Process exec(String command, String [] envp)----在指定环境的独立进程中执行指定命令和变量
public Process exec(String [] cmdArray, String [] envp)----在指定环境的独立进程中执行指定的命令和变量
public Process exec(String command,String[] envp,File dir)----在有指定环境和工做目录的独立进程中执行指定的字符串命令
public Process exec(String[] cmdarray,String[] envp,File dir)----在指定环境和工做目录的独立进程中执行指定的命令和变量
举例:
1. RunTime.getRuntime().exec(String command);
在windows下至关于直接调用 /开始/搜索程序和文件 的指令,好比
Runtime.getRuntime().exec("notepad.exe"); -------打开windows下记事本。
2. public Process exec(String [] cmdArray);
Linux下:
Runtime.getRuntime().exec(new String[]{"/bin/sh","-c", ";
Windows下:
Runtime.getRuntime().exec(new String[]{ "cmd", "/c", cmds});
深刻:
Process的几种方法:
1.destroy():杀掉子进程
2.exitValue():返回子进程的出口值,值 0 表示正常终止
3.getErrorStream():获取子进程的错误流
4.getInputStream():获取子进程的输入流
5.getOutputStream():获取子进程的输出流
6.waitFor():致使当前线程等待,若有必要,一直要等到由该 Process 对象表示的进程已经终止。若是已终止该子进程,此方法当即返回。若是没有终止该子进程,调用的线程将被阻塞,直到退出子进程,根据惯例,0 表示正常终止
注意:在java中,调用runtime线程执行脚本是很是消耗资源的,因此切忌不要频繁使用!
在调用runtime去执行脚本的时候,其实就是JVM开了一个子线程去调用JVM所在系统的命令,其中开了三个通道: 输入流、输出流、错误流,其中输出流就是子线程走调用的通道。
你们都知道,waitFor是等待子线程执行命令结束后才执行, 可是在runtime中,打开程序的命令若是不关闭,就不算子线程结束。好比如下代码。
代码:private static Process p = null;
p = Runtime.getRuntime().exec("notepad.exe");
p.waitFor();
System.out.println("--------------------------------------------我被执行了");
以上代码中,打开windows中记事本。若是咱们不手动关闭记事本,那么输出语句就不会被执行,这点是须要理解的。
process的阻塞:
在runtime执行大点的命令中,输入流和错误流会不断有流进入存储在JVM的缓冲区中,若是缓冲区的流不被读取被填满时,就会形成runtime的阻塞。因此在进行好比:大文件复制等的操做时,咱们还须要不断的去读取JVM中的缓冲区的流,来防止Runtime的死锁阻塞。
代码:linux中拷贝文件防止阻塞的写法