Runtime.getRuntime().exec学习和应用,java代码执行命令

您所在的位置:网站首页 在cmd中运行指令出现runtime的错误 Runtime.getRuntime().exec学习和应用,java代码执行命令

Runtime.getRuntime().exec学习和应用,java代码执行命令

2023-06-16 01:29| 来源: 网络整理| 查看: 265

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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3