java调用操作系统命令主要使用到Process以及ProcessBuilder这两个类。
Process:JDK1.5之前调用系统命令广泛使用的一个抽象类,一般都是通过Runtime.exec()和ProcessBuilder.start()来间接创建其实例,但是其功能相对较少。
ProcessBuilder:JDK1.5之后出现的一个final类,有两个带参数的构造方法,可以通过构造方法来直接创建其对象,为进程提供了更多功能(可获取/设置系统的环境变量、设置命令执行路径),但是其不是同步的。
一、使用Process调用系统命令
1、调用linux简单的shell语句,调用例子如下:
public static void shell1() {
String execution = "whoami"; //要执行的shell语句
Process process = null;
BufferedReader input = null;
String user = "";
try
{
process = Runtime.getRuntime().exec(execution);
process.waitFor();
int result = process.exitValue(); //为0表示执行成功,非0表示shell执行出错
input = new BufferedReader(new InputStreamReader(process.getInputStream()));
user = input.readLine(); //user为当前登录的用户名
System.out.println(user);
}catch (Exception e) {
//异常操作
}finally
{
//销毁process(process.destroy())以及关闭流
}
}
2、调用linux含有管道的复杂shell,调用例子如下:
public static void shell2(){String[] execution = {"/bin/sh","-c","ps -ef | grep mysqld"}; //"ps -ef | grep mysqld" 为要执行的命令
Process process = null;
BufferedReader input = null;
String user = "";
try
{
process = Runtime.getRuntime().exec(execution);
process.waitFor();
input = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line = null;
while((line = input.readLine())!=null){
System.out.println(line);
}
}catch (Exception e) {
//异常操作
}finally
{
//销毁process(process.destroy())以及关闭流
}
}
二、使用ProcessBuilder调用系统命令
1、调用linux简单的shell语句,调用例子如下
public static void shell1(){
String execution = "whoami";
Process process = null;
BufferedReader input = null;
try
{
ProcessBuilder builder = new ProcessBuilder("sh", "-c", execution); //即执行 sh -c whoami
//也可直接为 ProcessBuilder builder = new ProcessBuilder(execution);
Map<String, String> map = builder.environment(); //获得进程的环境
system.out.println(map.get("JAVA_HOME")); //打印配置的JAVA_HOME的环境变量
map.put("JAVA_HOME","/home/admin/jdk"); //设置环境变量JAVA_HOME为/home/admin/jdk
builder.redirectErrorStream(true);
process = builder.start();
input = new BufferedReader(new InputStreamReader(process.getInputStream()));
String userNum = input.readLine();
}
catch (Exception e)
{
//异常操作
}
finally
{
//销毁process(process.destroy())以及关闭流
}
}
2、调用linux含有管道的复杂shell,调用例子如下:
public static void shell2() {
String execution = "ps -ef | grep java | grep -v grep | wc -l"; //要执行的shell
Process process = null;
BufferedReader input = null;
try
{
ProcessBuilder builder = new ProcessBuilder("sh", "-c", execution);
builder.directory(new File("/home/admin")); //设置在/home/admin目录下执行命令
builder.redirectErrorStream(true);
process = builder.start();
input = new BufferedReader(new InputStreamReader(process.getInputStream()));
String userNum = input.readLine();
System.out.println(userNum); //可以打印出java进程数
}
catch (Exception e)
{
//异常操作
}
finally
{
//销毁process(process.destroy())以及关闭流
}
}
3、Windows调用 F 盘 WIN 目录下的 test.jar ,调用例子如下:
public static void shell3(){Process process = null;
try
{
ProcessBuilder builder = new ProcessBuilder("java", "-jar", "test.jar"); //在命令行执行 “java -jar test.jar”
builder.directory(new File("F:/WIN")); //设置工作目录,即执行F盘WIN目录下的test.jar
builder.redirectErrorStream(true);
process = builder.start();
}
catch (Exception e)
{
//异常操作
}
finally
{
//销毁process(process.destroy())以及关闭流
}
}