Runtime.getRuntime().exec学习和应用

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


方法:

Process

exec(String command) 在单独的进程中执行指定的字符串命令。

Process

exec(String cmdarray[]) 在单独的进程中执行指定命令和变量。

Process

exec(String[] cmdarray, String[] envp) 在指定环境的独立进程中执行指定命令和变量。

Process

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

Process

exec(String command, String[] envp) 在指定环境的单独进程中执行指定的字符串命令。

Process

exec(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操作

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值