java调用操作系统命令主要使用到Process以及ProcessBuilder这两个类。
Process:JDK1.5之前调用系统命令广泛使用的一个抽象类,一般都是通过Runtime.exec()和ProcessBuilder.start()来间接创建其实例,但是其功能相对较少。
ProcessBuilder:JDK1.5之后出现的一个final类,有两个带参数的构造方法,可以通过构造方法来直接创建其对象,为进程提供了更多功能(可获取/设置系统的环境变量、设置命令执行路径),但是其不是同步的。
一、使用Process调用系统命令
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())以及关闭流 } }
二、使用ProcessBuilder调用系统命令
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())以及关闭流 } }
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())以及关闭流 } }