Runtime.getRuntime().exec()方法主要用于执行外部的程序或命令。

方法:

Processexec(String command) 在单独的进程中执行指定的字符串命令。
Processexec(String cmdarray[]) 在单独的进程中执行指定命令和变量。
Processexec(String[] cmdarray, String[] envp) 在指定环境的独立进程中执行指定命令和变量。
Processexec(String[] cmdarray, String[] envp, File dir) 在指定环境和工作目录的独立进程中执行指定的命令和变量。
Processexec(String command, String[] envp) 在指定环境的单独进程中执行指定的字符串命令。
Processexec(String command, String[] envp, File dir) 在有指定环境和工作目录的独立进程中执行指定的字符串命令。

 

相关说明:

      dir 指定了新子进程的工作目录。如果 dir 为 null,那么子进程会继承当前进程的当前工作目录

先来比较exec(String command)与exec(String[] cmdArray)的区别,其实他们是等价的,最终都会

调用:exec(String command, String[] envp, File dir);

public Process exec(String command) throws IOException {
 
return exec(command, null, null);
 
}
 
public Process exec(String cmdarray[]) throws IOException {
 
return exec(cmdarray, null, null);
 
}

看看方法exec(String command, String[] envp, File dir)的实现代码:

public Process exec(String[] cmdarray, String[] envp, File dir)
 
throws IOException {
 
return new ProcessBuilder(cmdarray)
 
.environment(envp)
 
.directory(dir)
 
.start();
 
}

     从上面的代码,我们可以看出最终调用的代码都是:exec(String[] cmdArray,String envp,File dir)。exec(String command)相当于exec(command,null,null),exec(String[] cmdArray)相当于exec(cmdArray,null,null)。


参数说明:

cmdarray - 包含所调用命令及其参数的数组。
envp - 字符串数组,其中每个元素的环境变量的设置格式为 name=value,如果子进程应该继承当前进程的环境,或该参数为 null。
dir - 子进程的工作目录;如果子进程应该继承当前进程的工作目录,则该参数为 null。


       另外,执行exec(String command)不等同于直接执行command line命令,比如命令:

javap -l xxx > output.txt
       这时要用exec(String[] cmdArray)。如例:

Process p = Runtime.getRuntime().exec(new String[]{"/bin/sh","-c",
    "javap -l xxx > output.txt"});

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

说明:目前项目中使用Runtime.getRuntime().exec进行脚本的一个跑批,然后调用waitFor()方法


实际应用:

       近期通过文件总线进行获取文件压缩包,底层是通过https同步请求获取,当拿到这个压缩包后,需要进行解压,解压属于定时任务中的一部分,那如何有效的通过java代码操作linux命令进行解压就成为了一个问题。
       那么自己得通过电脑模拟线上进行解压;


1 环境搭建

       在linux上通过docker 安装java环境,这个自己搭建,不多说,路径自己选择存放

 2 准备一个jar包

  Process p = Runtime.getRuntime().exec("tar -zxvf /home/20220910.tar.gz -C /home/"); 这样执行也是可以的,从上面的方法上看,底层调用的是相同的源码。
         这是一个简单的springboot工程,然后install一下打成jar包


3 在linux上运行

    linux上如何执行一个jar包是一个关键问题,这时候可以通过java -h 查看帮助

 

tar.gz压缩包存放的位置:

 

执行命令:
                java -cp tarUnzip-1.0-SNAPSHOT.jar com.orange.tar.Runshell1
com.orange.tar.Runshell1--是指main主方法的类路径

 

对比一下,此时压缩文件已解压,并且是在linux上执行的java操作 


————————————————
版权声明:本文为CSDN博主「soranges」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_44696583/article/details/126862058

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐