ProcessBuilder工具类

该博客介绍了如何在Java中使用ProcessBuilder类执行外部命令,包括读取命令输出和错误信息,以及处理可能出现的异常。示例代码展示了如何执行单个命令和多个Linux命令的流程。

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

一.代码



import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.List;

/**
 * @Date :Created in 4:49 PM 2019/9/26
 *
 *  *
 *  * 测试方式:
 *  *
 *  * public static void main(String[] args) {
 *  *         List<String> commend = new ArrayList<>();
 *  *         commend.add("java");
 *  *         commend.add("-version");
 *  *         Process process = ProcessBuilderUtil.exec(this.commend);
 *  *         String message = ProcessBuilderUtil.getError(process);
 *  *         String error = ProcessBuilderUtil.getError(process);
 *  *         ProcessBuilderUtil.destroy(process);
 *  *     }
 *  *
 */

public class ProcessBuilderUtil {

    private static ProcessBuilder processBuilder = new ProcessBuilder();

    /**
     * 执行脚本命令
     * @param commend
     * @return  java.lang.Process
     * @date    2019/9/26
     * @throws
     */
    public static Process exec(List<String> commend) {
        Process process = null;
        try {
            String[] commends = new String[commend.size()];
            commend.toArray(commends);
            processBuilder.command(commends);
            process = processBuilder.start();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return process;
    }

    /**
     *
     * @param process
     * @return  java.lang.String
     * @date    2019/9/26
     * @throws
     */
    public static String getOutput(Process process) {
        String output = null;
        BufferedReader reader = null;
        try {
            if (process != null) {
                StringBuffer stringBuffer = new StringBuffer();
                reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
                while (reader.read() != -1){
                    stringBuffer.append("\n" + reader.readLine());
                }
                output = stringBuffer.toString();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        closeQuietly(reader);
        return output;
    }

    /**
     * 获取错误信息
     * @param process
     * @return  java.lang.String
     * @date    2019/9/26
     * @throws
     */
    public static String getError(Process process) {
        String errput = null;
        BufferedReader reader = null;
        try {
            if (process != null) {
                StringBuffer stringBuffer = new StringBuffer();
                reader = new BufferedReader(new InputStreamReader(process.getErrorStream()));
                while (reader.read() != -1){
                    stringBuffer.append("\n" + reader.readLine());
                }
                errput = stringBuffer.toString();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        closeQuietly(reader);
        return errput;
    }

    /**
     * 关流
     * @param reader
     * @return  void
     * @date    2019/9/26
     * @throws
     */
    public static void closeQuietly(Reader reader) {
        try {
            if (reader != null) {
                reader.close();
            }
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
    }

    /**
     * 终止进程
     * @param process
     * @return  void
     * @date    2019/9/26
     * @throws
     */
    public static void destroy(Process process) {
        if (process != null) {
            process.destroyForcibly();
        }
    }
}

二.注意

如果出现"ProcessBuilder java.io.IOException: Cannot run program error=2, No such file or directory" 错误,则可以使用

List<String> commend = new ArrayList<>();
commend.add("/bin/sh");
commend.add("-c");
commend.add("第1条命令","第2条命令","第3条命令"); //这里可以实现执行多条linux命令
Process process = ProcessBuilder.exec(commend);
String message = ProcessBuilder.getOutput(process);
String error = ProcessBuilder.getError(process);
ProcessBuilder.destroy(process);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Johnny2004

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值