
Runtime.getRuntime().exec学习和应用,java代码执行命令
exec(String command)相当于exec(command,null,null),exec(String[] cmdArray)相当于exec(cmdArray,null,null)。如果没有终止该子进程,调用的线程将被阻塞,直到退出子进程,根据惯例,0 表示正常终止。近期通过文件总线进行获取文件压缩包,底层是通过https同步请求获取,当拿到这个压缩包后,需要进行解压,解压属于定时任
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操作
————————————————
版权声明:本文为CSDN博主「soranges」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_44696583/article/details/126862058
更多推荐
所有评论(0)