Java中使用Runtime和Process类运行外部程序

使用场景

java与非java程序之间的交互

Runtime

使用Runtime.getRuntime().exec()方法可以在java程序里运行外部程序。

  1. exec(String command)
  2. exec(String command, String envp[], File dir):传递环境变量并标识当前目录
  3. exec(String cmd, String envp[]):传递环境变量
  4. exec(String cmdarray[])
  5. exec(String cmdarray[], String envp[])
  6. exec(String cmdarray[], String envp[], File dir)

Process

通过Process的getInputStream(),getOutputStream()和getErrorStream()方法可以得到输入输出流,然后通过InputStream可以得到程序对控制台的输出信息,通过OutputStream可以给程序输入指令,这样就达到了程序的交换功能。
process类主要有下面几个方法

  1. destroy():杀掉子进程
  2. exitValue():返回子进程的出口值,值 0 表示正常终止
  3. getErrorStream():获取子进程的错误流
  4. getInputStream():获取子进程的输入流
  5. getOutputStream():获取子进程的输出流
  6. waitFor():导致当前线程等待,如有必要,一直要等到由该 Process 对象表示的进程已经终止。如果已终止该子进程,此方法立即返回。如果没有终止该子进程,调用的线程将被阻塞,直到退出子进程,根据惯例,0 表示正常终止;

简单实践

java 代码

import java.io.BufferedReader;
import java.io.File;
import java.io.InputStreamReader;

class Scratch {
    public static void main(String[] args) throws Exception{
        // 简单执行一条命令,可以看到当前目录为classpath
        Process process = Runtime.getRuntime().exec("pwd");
        InputStreamReader inputStreamReader = new InputStreamReader(process.getInputStream());
        BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

        String line = null;
        while ((line = bufferedReader.readLine()) != null) {
            System.out.println(line);
        }

        // 执行带有环境变量的exec,环境变量在命令执行前被设置
        String[] envp = {"a=yj"};
        Process process1 = Runtime.getRuntime().exec(new String[]{"/bin/sh", "-c", "echo $a"}, envp);
        InputStreamReader inputStreamReader1 = new InputStreamReader(process1.getInputStream());
        BufferedReader bufferedReader1 = new BufferedReader(inputStreamReader1);

        String line1 = null;
        while ((line1 = bufferedReader1.readLine()) != null) {
            System.out.println(line1);
        }

        // 改变当前目录执行shell脚本,环境变量在脚本执行前被设置
        Process process2 = Runtime.getRuntime().exec("./hello.sh", new String[]{"a=cfh"}, new File("/Users/chenfeihao/Desktop"));
        InputStreamReader inputStreamReader2 = new InputStreamReader(process2.getInputStream());
        BufferedReader bufferedReader2 = new BufferedReader(inputStreamReader2);

        String line2 = null;
        while ((line2 = bufferedReader2.readLine()) != null) {
            System.out.println(line2);
        }

    }

}

Dekstop目录下的hello.sh脚本

  1 # !/bin/sh
  2
  3 echo $a

执行结果

/Users/chenfeihao/Desktop/springboot_practice
yj
cfh

你可能感兴趣的:(java基础)