JAVA外部程序调用(Runtime.getRuntime().exec)

概述

Runtime.getRuntime().exec 用于调用外部可执行程序或系统命令,并外部程序的标准输入、标准输出和标准错误到缓冲池。功能和windows“运行”类似。

借助 Runtime.getRuntime().exec() 可以运行一个windows的exe程序,如图

执行代码如下

new InputStreamReader(p.getInputStream(),"GBK")的作用是规避码表格式错误

某些同学可能会出现打印响应结果的时候, 中文乱码的问题. 该问题可能是IDEA已经被更改为UTF-8的字符编码, 而windows系统仍然默认是GBK的字符编码集。

因此, 该行代码, 在将获取到的响应字节流转换为字符流进行输出的时候, 指定以GBK的编解码来解析该字节流, 就不会出现中文乱码问题了. 数据在传输的时候是以字节流的方式进行。

因此编解码应该使用同一套字符集. 常见的有UTF-8, GBK, ISO8859-1等. 即便按照百度的, 在regedit注册表中修改默认编码集为chcp 65001也没有作用, 可能是我没有重启电脑的缘故, 不清楚. 但是, 添加_(更改)该行代码能有效解决中文乱码问题

. BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream(),"GBK"));

注意:

Runtime.exec() 不是cmd或shell环境,因此无法直接调用dir等命令,需要在程序中读取运行的操作系统平台,以调用不同的命令解释器(NT:cmd.exe,windows 95/98:command.exe,linux:/bin/sh) Procss类将持有该程序返回 Java VM 的引用。这个procss类是一个抽象类,具体子类的实现依赖于不同的底层操作系统。

实例代码如下

附上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)----在指定环境和工作目录的独立进程中执行指定的命令和变量

他还有一些常见问题,

用一个bat批处理程序,调用几十次后会莫名的不再执行,无任何异常抛出。千试万试,LOG精细到逐行,只知道走到Runtime.getRuntime().exec()程序就停止了,但打死不知道为什么。那真以为里面有鬼。后来寻摸着Runtime.getRuntime().exec()有问题,真给我找到答案了。

大概原因是,调用Runtime.getRuntime().exec()后,如果不及时捕捉进程的输出,会导致JAVA挂住,看似被调用进程没退出。所以,解决办法是,启动进程后,再启动两个JAVA线程及时的把被调用进程的输出截获。

一下子,整个世界清爽多了。。。

经验分享 程序员 微信小程序 职场和发展