但行好事
莫论前程❤

Java中的Process调用Linux命令(cd的处理)

​ java在企业级项目开发中,无论是强制性的功能需要,还是为了简便java的实现,需要调用服务器命令脚本来执行。在java中,RunTime.getRuntime().exec()就实现了这个功能。

用法:

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

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

Process的几种方法:

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

详解

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

参数:

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

返回:

  • 一个新的 Process 对象,用于管理子进程

检查 cmdarray是否是一条有效的操作系统命令。哪些命令有效取决于系统,但是该命令至少必须有一个非 null 字符串的非空列表。

启动操作系统进程的方式完全取决于系统。其中有很多方面会导致错误:

  • 未找到操作系统程序文件。
  • 对程序文件的访问被拒绝。
  • 工作目录不存在。
  • 这些情况都会抛出一个异常。该异常的具体特性取决于系统,但它总是 IOException 的一个子类。

实战:

如果要在java程序里执行一条linux可以用下面的写法

Process process = Runtime.getRuntime().exec(cmd);
process.waitFor();

但是当遇到像cd这样的命令时,上面的这种写法切不管用,很多时候我们以为是命令输错了或是文件找不到,实际不是。下面给出对应的方法:

含有管道符(|)多级命令串联查询

public List<String> executeLinuxCmd(String cmd) {
        System.out.println("cmd = : " + cmd);
        try {
            Process proc = Runtime.getRuntime().exec(new String[] {"/bin/sh", "-c", cmd});
            InputStream in = proc.getInputStream();
            BufferedReader bs = 
                new BufferedReader(new InputStreamReader(in));
            List<String> list = new ArrayList<String>();
            String result = null;
            while ((result = bs.readLine()) != null) {
                System.out.println("job result [" + result + "]");
                list.add(result);
            }
            in.close();
            // process.waitFor();
            process.destroy();
            return list;
        } catch (IOException e) {
            e.printStackTrace();
        }finally{

        }
        return null;
    }

含有cd操作的方法示例

  1. 问题背景

    1.1 使用java的process实现tar命令的压缩,将指定文件夹下的文件压缩到指定路径下。

    如果直接使用

    tar -zxvf qynj/file/bdapData/a.tar.gz /qynj/file/bdapData/

    则压缩的文件夹会出现多级目录。

通用方法(可以实现多命令传递,又可以获取控制台日志)

public List<String> executeCmd(List<String> commands) {
        List<String> rspList = new ArrayList<String>();
        Process proc = null;
        BufferedReader in = null;
        PrintWriter out = null;
        try {
            proc = Runtime.getRuntime().exec("/bin/bash", null, null);
            in = new BufferedReader(new InputStreamReader(proc.getInputStream()));
            out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(proc.getOutputStream())), true);
            for (String line : commands) {
                out.println(line);
            }
            out.println("exit");// 这个命令必须执行,否则in流不结束。
            String rspLine = "";
            while ((rspLine = in.readLine()) != null) {
                rspList.add(rspLine);
            }
            proc.waitFor();
        } catch (IOException e1) {
            e1.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally{
            if(out != null){
                out.close();
            }
            if(in != null){
                in.close();
            }
            proc.destroy();
        }
        return rspList;
    }
public static void main(String[] args) {
        List<String> list = new ArrayList<String>();
        list.add("cd /qynj/qynjdatabakp/file/bdapData");
        list.add("tar -zxvf ./asd.tar.gz  ./asd/");
        List<String> strs = executeCmd(list);
}
赞(0) 打赏
未经允许不得转载:刘鹏博客 » Java中的Process调用Linux命令(cd的处理)
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏