首页 > 编程语言 >java终端命令工具

java终端命令工具

时间:2023-11-07 16:36:12浏览次数:31  
标签:java String static 终端 new dos 工具 null

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

/**
 * 终端命令工具
 * 
 * @author JHL
 * @version 1.0
 * @date 2023/11/7 14:15
 * @since : JDK 11
 */
public class CommandUtil {

    /**
     * 终端程序
     * windows下为 cmd
     * linux/mac下为 [ sh | bash | ... ]
     */
    public static final String COMMAND_SH = "cmd";
    /**
     * 终端-行结束符
     */
    public static final String COMMAND_LINE_END = "\n";
    /**
     * 终端-退出命令
     */
    public static final String COMMAND_EXIT = "exit\n";
    /**
     * 调试模式
     */
    private static final boolean IS_DEBUG = true;

    /**
     * 执行单条命令
     */
    public static List<String> execute(String command) {
        return execute(new String[]{command});
    }

    /**
     * 可执行多行命令(bat)
     */
    public static List<String> execute(String[] commands) {
        List<String> results = new ArrayList<>();
        int status = -1;
        if (commands == null || commands.length == 0) {
            return null;
        }
        debug("所有要执行的命令: " + String.join(" ", commands));
        Process process = null;
        BufferedReader successReader = null;
        BufferedReader errorReader = null;
        StringBuilder errorMsg = null;
        DataOutputStream dos = null;
        try {
            process = Runtime.getRuntime().exec(COMMAND_SH);
            dos = new DataOutputStream(process.getOutputStream());
            // 依次执行每条命令
            for (String command : commands) {
                if (command == null) {
                    continue;
                }
                dos.write(command.getBytes());
                dos.writeBytes(COMMAND_LINE_END);
                dos.flush();
                debug("执行命令: " + command);
            }
            // 退出
            dos.writeBytes(COMMAND_EXIT);
            dos.flush();
            // 等待执行代码 0 正常执行完毕退出
            status = process.waitFor();
            // 读取进程标准正常输出
            successReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
            String lineStr;
            while ((lineStr = successReader.readLine()) != null) {
                results.add(lineStr + "\n");
            }
            debug("命令行输出: \n" + String.join("", results));
            // 读取进程错误输出
            errorReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));
            errorMsg = new StringBuilder();
            while ((lineStr = errorReader.readLine()) != null) {
                errorMsg.append(lineStr + "\n");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (dos != null) {
                    dos.close();
                }
                if (successReader != null) {
                    successReader.close();
                }
                if (errorReader != null) {
                    errorReader.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            if (process != null) {
                process.destroy();
            }
        }
        debug(String.format(Locale.CHINA, "命令执行结束,错误消息:%s,执行状态码:%d", errorMsg, status));
        return results;
    }

    /**
     * DEBUG LOG
     *
     * @param message
     */
    private static void debug(String message) {
        if (IS_DEBUG) {
            System.out.println("######################### \t " + message);
        }
    }

    public static void main(String[] args) {
        List<String> result = CommandUtil.execute("ping 192.168.100.40");
    }
}

标签:java,String,static,终端,new,dos,工具,null
From: https://www.cnblogs.com/hhddd-1024/p/17815297.html

相关文章

  • WPF开发的小巧、美观桌面快捷工具GeekDesk开源项目--极客桌面
    今天给大家推荐一个基于WPF开发的,专门为程序员定制的桌面快捷工具。项目简介这是基于.Net+WPF开发的,一个小巧、UI美观的快捷工具。此项目发布以来就受到大家的喜欢,代码结构清晰非常适合用来学习。项目还在持续迭代中,有部分小问题,用来学习、体验完全没问题。作者一直在迭代升级......
  • Java基础
    Java基础语法1.注释注释不会执行,给写代码的人看三种注释:单行注释://多行注释:/**/文档注释:/***/publicclassHelloworld{publicstaticvoidmain(String[]args){//单行注释//控制台输出一个Hello,worldSystem.out.println("Hello,......
  • Java基础
    Java基础语法1.注释注释不会执行,给写代码的人看三种注释:单行注释://多行注释:/**/文档注释:/***/publicclassHelloworld{publicstaticvoidmain(String[]args){//单行注释//控制台输出一个Hello,worldSystem.out.println("Hello,......
  • asp.net中怎样用Javascript控制RequiredFieldValidator控件什么时候启用,什么时候不启
    Enable/DisableRequiredFieldValidatorwithJavascriptdocument.getElementById("requiredfieldvalidatorid").enabled=false;<asp:DropDownListID="ddlServiceName"runat="server"onchange='varDateValidator=docume......
  • jenkins Java heap space
    jenkinsJavaheapspace,是内存不够。 两个解决方案:一,修改配置文件windows系统中,找到Jenkins的安装路径,修改jenkins.xml将-Xmx256m改为-Xmx1024m或者更大重启jenkins服务。 二,jenkins增加全局配置(jenkins版本不一样,可能名称和菜单也会不一样。)系统配置--》全局......
  • 秦疆的Java课程笔记:17-20 入门 下
    17入门Java开发环境搭建JDK下载与安装(略)由于秦疆老师的网络视频教程录制于2019年,演示的JDK版本为1.8(也就是JDK8),而现在Oracle官网只提供JDK17与JDK21的下载,故本小节笔记不予记录。我实际安装的是最新的JDK21,具体安装方法与环境配置见另一篇博客:点击跳转JDK21安装及环境......
  • 在没有任何工具的情况下,如何将一个正方形七等分
    假设可以确定任何线的中点。1、连接对角线BD;2、连接正方形中线GH;3、连接矩形GHCD之对角线GC交正方形ABCD之对角线于a1点;4、线段aa1将边AD分为aD段为AD线段之1/3;5、以此类推,如图:线段bD为线段AD之1/4……建议不明白的人用方程来求解:设C点坐标为(0,0),A点坐......
  • Matlab数理统计工具箱应用简介
    1.概述Matlab的数理统计工具箱是Matlab工具箱中较为简单的一个,其牵扯的数学知识是大家都很熟悉的数理统计,因此在本文中,我们将不再对数理统计的知识进行重复,仅仅列出数理统计工具箱的一些函数,这些函数的意义都很明确,使用也很简单,为了进一步简明,本文也仅仅给出了函数的名称,没有列......
  • MATLAB-数理统计工具箱
    StatisticsToolboxDistributions.Parameterestimation.betafit-Betaparameterestimation.binofit-Binomialparameterestimation.dfittool-Distributionfittingtool.evfit-Extremevalueparameterestimation.expfit-Exp......
  • 一个java文件的JVM之旅
    准备我是小C同学编写得一个java文件,如何实现我的功能呢?需要去JVM(JavaVirtualMachine)这个地方旅行。变身我高高兴兴的来到JVM,想要开始JVM之旅,它确说:“现在的我还不能进去,需要做一次转换,生成class文件才行”。为什么这样呢?JVM不能直接加载java文件的原因:Java源代码中包含......