Java 调用系统命令 Runtime Process ProcessBuilder

本文介绍了一个Java工具类,用于执行系统命令并处理Cmder输出。通过ProcessBuilder启动进程,并使用线程读取标准输出和错误输出流。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java 调用系统命令 Cmder

包括对waitFor()阻塞的处理

package southday.java.util;

import java.io.BufferedReader;
import java.io.File;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.List;

/**
 * 命令行工具
 * @author southday
 * @date 2017年3月7日
 */
public class Cmder {
    public Cmder() {
        super();
    }

    private static class StreamReaderThread implements Runnable {
        InputStream ins = null;

        public StreamReaderThread(InputStream ins) {
            this.ins = ins;
        }

        @Override
        public void run() {
            BufferedReader br = new BufferedReader(new InputStreamReader(ins));
            try {
                String line = null;
                while ((line = br.readLine()) != null) {
                    System.out.println(line);
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                FileUtil.closeSource(ins);
                FileUtil.closeSource(br);
            }
        }
    }

    /**
     * 执行系统命令
     * @param cmd        完整命令,如:"tar -xvf sql_scripts.tar -C ."
     * @param directory  命令在指定目录下执行
     * @return
     */
    public static boolean exec(String cmd, String directory) {
        List<String> cmds = Arrays.asList(cmd.split("\\s+"));
        return exec(cmds, directory);
    }

    /**
     * 执行系统命令
     * @param cmds       完整命令以空格分割得到List
     * @param directory  命令在指定目录下执行
     * @return
     */
    public static boolean exec(List<String> cmds, String directory) {
        printCurrentDIR(directory);
        printCmd(cmds);
        try {
            ProcessBuilder procBuilder = new ProcessBuilder(cmds);
            if (directory != null && directory.trim().length() > 1) {
                procBuilder.directory(new File(directory));
            }
            procBuilder.redirectErrorStream(true);
            Process proc = procBuilder.start();
            new Thread(new StreamReaderThread(proc.getInputStream())).start();
            new Thread(new StreamReaderThread(proc.getErrorStream())).start();
            proc.waitFor();
            proc.destroy();
            if (proc.exitValue() != 0) {
                return false;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }

    /**
     * 打印命令信息
     * @param cmds
     */
    public static void printCmd(List<String> cmds) {
        StringBuilder sb = new StringBuilder();
        for (String s : cmds) {
            sb.append(s + " ");
        }
        System.out.println("[cmd] -> " + sb.toString());
    }

    /**
     * 打印命令执行的当前目录
     * @param directory
     */
    private static void printCurrentDIR(String directory) {
        if (directory == null || directory.trim().length() < 1) {
            directory = System.getProperty("user.dir");
        }
        System.out.println("[directory] -> " + directory);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值