Java 通过 Runtime 在 android 中执行一些操作

linux runtime pm机制的深入理解   https://blog.csdn.net/linux_devices_driver/article/details/38092115


Java 可以通过 Runtime 调用Linux命令 :   Runtime.getRuntime().exec(command)

调用 Runtime.exec 方法将产生一个本地的进程,并返回一个Process子类的实例
(注意:Runtime.getRuntime().exec(command)返回的是一个Process类的实例)该实例可用于控制进程或取得进程的相关信息。
由于调用 Runtime.exec 方法所创建的子进程没有自己的终端或控制台,因此该子进程的标准IO(如stdin,stdou,stderr)
都通过 Process.getOutputStream(),Process.getInputStream(), Process.getErrorStream() 方法重定向给它的父进程了。


用户需要用这些stream来向子进程输入数据或获取子进程的输出,下面的代码可以取到 linux 命令的执行结果:


例1: JAVA利用Runtime执行py命令

public static void execPythonShell(File file) throws IOException {
  String path = Utils.class.getClassLoader().getResource(“/import.py”).getPath();
  Runtime runtime = Runtime.getRuntime();
  BufferedReader br = null;
  try {
   // -c 意思是执行完成自动关闭,这里多条linux命令通过&&连接到一起
   String[] cmds = new String[] {"/bin/sh","-c","cd " + path + "&&python edit_support_export_infor.py " + file.getPath() };
   Process process = runtime.exec(cmds);
   br = new BufferedReader(new InputStreamReader(process.getInputStream(), "GBK"));
   String tmp = null;
   while ((tmp = br.readLine()) != null) {
    System.out.println("Shell Message : " + tmp);
   }
  } catch (IOException e) {
   logger.error(e);
  } finally {
   br.close();
  }
 }



例2: java调用process执行 shell 命令
public class ShellUtil {
    public static String runShell(String shStr) throws Exception {

        Process process;
        process = Runtime.getRuntime().exec(new String[]{"/bin/sh","-c",shStr});
        process.waitFor();
        BufferedReader read = new BufferedReader(new InputStreamReader(process.getInputStream()));
        String line = null;
        String result = "";
        while ((line = read.readLine())!=null){
            result+=line;
        }
        return result;//result 即为执行命令的输出
    }

    public static String runShellls(String shStr) throws Exception {
    try {
      String[] cmd = new String[]{”/bin/sh”, “-c”, ” ls “};
      Process ps = Runtime.getRuntime().exec(cmd);
      BufferedReader br = new BufferedReader(new InputStreamReader(ps.getInputStream()));
      StringBuffer sb = new StringBuffer();
      String line;
	while ((line = br.readLine()) != null) {
	    sb.append(line).append(”\n”);
	}
       String result = sb.toString();
       System.out.println(result)

     } catch (Exception e) {
     }
    }
}
注意:如果是windows操作系统要改为Runtime.getRuntime().exec(new String[]{"**cmd** exe","-c","command"});




例3. 当要执行多条时且不依赖事务,分开多次调用
public class ExecuteShell {
    public static void main (String[] args){
        String command1 = "some command";
        String command2 = "some command";
        String message1 = ShellUtil.runShell(command1);
        String message2 = ShellUtil.runShell(command2);
        System.out.println(message1);
        System.out.println(message2);
    }
}

但是当命令之间有事务依赖时,比如一条命令是登录数据库,第二条执行查询语句,上面分开多次调用的方式就不行。需要做改动如下
public class ExecuteShell {
    public static void main (String[] args){
        String command1 = "some command";
        String command2 = "some command";
        String command = command1 + " && " + command2;
        String message = ShellUtil.runShell(command);
        System.out.println(message);
    }
}


例4. windows Runtime 执行多个cmd命令问题

    Runtime runtime = Runtime.getRuntime();  
    Process proc = runtime.exec("sh");
    DataOutputStream os = new DataOutputStream(proc.getOutputStream());
    os.writeBytes("su\n");
    os.writeBytes("./deviceinfo  > /data/test.txt\n");
    os.writeBytes("exit\n");
    os.flush();

猜你喜欢

转载自blog.csdn.net/kongbaidepao/article/details/80453495