RunTime.getRuntime().exec()运行脚本命令介绍和阻塞

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中拷贝文件防止阻塞的写法

时间: 2024-12-27 19:23:33

RunTime.getRuntime().exec()运行脚本命令介绍和阻塞的相关文章

java中Runtime.getRuntime().exec()的坑,会造成阻塞的解决

synchronized (this) { process = Runtime.getRuntime().exec(cmds); } //记录进程缓存错误信息 final StringBuffer errorLog = new StringBuffer(); //获取执行进程的错误流 final InputStream errorStream = process.getErrorStream(); final InputStream inputStream = process.getInputS

Runtime.getRuntime.exec()执行linux脚本导致程序卡死有关问题

Runtime.getRuntime.exec()执行linux脚本导致程序卡死问题问题: 在Java程序中,通过Runtime.getRuntime().exec()执行一个Linux脚本导致程序被挂住,而在终端上直接执行这个脚本则没有任何问题.原因: 先来看Java代码: public final static void process1(String[] cmdarray) {        Process p = null;        BufferedReader br = null

使用Runtime.getRuntime().exec()在java中调用python脚本

举例有一个Python脚本叫test.py,现在想要在Java里调用这个脚本.假定这个test.py里面使用了拓展的包,使得pythoninterpreter之类内嵌的编译器无法使用,那么只能采用java调用控制台进程,即 Runtime.getRuntime().exec(),来运行这个python脚本. 在windows下运行这个程序,假如是参考了一些百度来的被转载了无数遍的文章,很有可能运行结果是根本没有执行这个脚本.经过测试,在java中执行如下代码可以成功运行test.py文件: --

通过Runtime.getRuntime().exec调用底层Linux下的程序或脚本

Android Runtime使得直接调用底层Linux下的可执行程序或脚本成为可能 比如Linux下写个测试工具,直接编译后apk中通过Runtime来调用 或者写个脚本,apk中直接调用,省去中间层或者JNI 这个至少效率应该比较高吧 代码: [java] view plaincopy public class test extends Activity { TextView text; /** Called when the activity is first created. */ @O

Android: 通过Runtime.getRuntime().exec调用底层Linux下的程序或脚本

Android Runtime使得直接调用底层Linux下的可执行程序或脚本成为可能 比如Linux下写个测试工具,直接编译后apk中通过Runtime来调用 或者写个脚本,apk中直接调用,省去中间层或者JNI 这个至少效率应该比较高吧 代码: [java] view plaincopy 1 public class test extends Activity { 2 TextView text; 3 4 /** Called when the activity is first create

Runtime.getRuntime().exec中命令含有括号问题

在写批量执行bat工具的时候,想起了之前写的定时小工具里面的执行方法. 使用Runtime.getRuntime().exec方法. Runtime.getRuntime().exec("cmd /c start c:/test.bat") 这样就可以像dos窗口直接执行命令行一样. getRuntime返回Runtime的实例化对象,exec方法是返回Process对象. 查看Process类可以发现: The ProcessBuilder.start() and Runtime.e

Java Runtime.getRuntime().exec 执行带空格命令解决办法

String command = OpenOffice_HOME + "program\\soffice -headless -accept=\"socket,host=127.0.0.1,port=8100;urp;\" -nofirststartwizard "; command = "cmd /c start "+command.replaceAll(" ","\" \""); P

调用Runtime.getRuntime().exec()执行Linux脚本防挂死和返回脚本输出

1.在实际开发中,使用Runtime.getRuntime().exec()执行Linux脚本时,需要同时读取标准输出流与错误输出流缓冲区数据,因为操作系统缓冲区大小有限制,不及时处理会导致缓冲区占满而挂住,这种问题发生在于开发人员对该接口不了解而引发Bug. 具体可以通过使用两个线程同时去读错误和标准输出流缓冲区数据,然后用proc.waitFor()可以获取执行的结果.这种事最常见的场景,只关注脚本执行结果. 2.但在实际开发中,通过Runtime.getRuntime().exec()执行

Runtime.getRuntime().exec(cmd)执行adb shell脚本可能出现的问题

例如:adb shell sendevent /dev/input/event3 1 $((0xca)) 1上面语句中含有$((0xca)) ,执行Runtime.getRuntime().exec("sendevent /dev/input/event3 1 $((0xca)) 1"),不会报错,但也不会生效,解决办法为: (1)先将$((0xca))中的0xca的十六进制转换为十进制202,$((202)),再执行Runtime.getRuntime().exec("se