Java调用bat sh脚本通用类

Wesley13
• 阅读 446

java调用bat、shell脚本通用类,工作记录。

package test;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;

import test.ProcessUtil.Result.Judege;

public class ProcessUtil
{

    private static final ExecutorService EXECUTORS = Executors.newFixedThreadPool(4);

    public static ProcessRunner buildProcessRunner()
    {
        return new ProcessRunner();
    }

    public static class ProcessRunner
    {
        private int maxErrorLineNumb = 100;

        private int maxInputLineNumb = 500;

        /**
         * 调用核心的命令
         * 
         * [@param](https://my.oschina.net/u/2303379) cmd
         *            命令
         * [@param](https://my.oschina.net/u/2303379) cmdInputParas
         *            执行命令需要输入的参数,比如命令行登录数据库需要输入密码<br>
         *            echo "password" | cmd
         * [@return](https://my.oschina.net/u/556800) 返回值,包括错误回显,正确回显,整个脚本执行的返回码
         * 
         */
        public Result runCMD(List<String> cmd, List<String> cmdInputParas)
        {
            Process process = null;
            BufferedWriter bw = null;
            try
            {
                ProcessBuilder processBuilder = new ProcessBuilder(cmd);
                process = processBuilder.start();
                bw = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));
                for (String p : cmdInputParas)
                {
                    bw.write(p);
                    bw.newLine();
                }
                bw.flush();
                bw.close();
                Callable<List<String>> inputRunner = new Runner(maxErrorLineNumb, process.getInputStream());
                FutureTask<List<String>> inputTask = new FutureTask<List<String>>(inputRunner);
                EXECUTORS.execute(inputTask);
                Callable<List<String>> errorRunner = new Runner(maxInputLineNumb, process.getErrorStream());
                FutureTask<List<String>> errorTask = new FutureTask<List<String>>(errorRunner);
                EXECUTORS.execute(errorTask);
                List<String> inputResult = inputTask.get();
                List<String> errorResult = errorTask.get();
                int returnCode = process.waitFor();
                return new Result(inputResult, errorResult, returnCode);

            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
            catch (InterruptedException e)
            {
                e.printStackTrace();
            }
            catch (ExecutionException e)
            {
                e.printStackTrace();
            }
            finally
            {
                try
                {
                    if (bw != null)
                    {
                        bw.close();
                    }
                }
                catch (IOException e)
                {

                }
                if (process != null)
                {
                    process.destroy();
                }

            }
            return new Result();
        }

        /**
         * 调用核心的命令
         * 
         * [@param](https://my.oschina.net/u/2303379) cmd
         *            命令
         * 
         * [@return](https://my.oschina.net/u/556800) 返回值,包括错误回显,正确回显,整个脚本执行的返回码
         */
        public Result runCMD(List<String> cmd)
        {
            return runCMD(cmd, Arrays.asList());
        }

    }

    /**
     * 执行命令类
     * 
     */
    private static class Runner implements Callable<List<String>>
    {

        private int maxLineNumb;

        private InputStream inputStream;

        public Runner(int maxLineNumb, InputStream inputStream)
        {
            super();
            this.maxLineNumb = maxLineNumb;
            this.inputStream = inputStream;
        }

        @Override
        public List<String> call()
        {
            List<String> result = new ArrayList<String>();
            BufferedReader br = null;
            try
            {
                br = new BufferedReader(new InputStreamReader(inputStream));
                int i = 0;
                String line = null;
                while (null != (line = br.readLine()) && (i++ < maxLineNumb))
                {
                    result.add(line);
                }
                return result;
            }
            catch (IOException e)
            {

                e.printStackTrace();
            }
            finally
            {
                try
                {
                    if (br != null)
                    {
                        br.close();
                    }
                }
                catch (IOException e)
                {

                }
            }
            return result;
        }

    }

    /**
     * 结果
     * 
     */
    public static class Result
    {
        // 回显
        private List<String> inputInfos;
        // 错误回显
        private List<String> errorInfos;
        // 返回码
        private int returnCode = -1;

        public Result(List<String> inputInfos, List<String> errorInfos, int returnCode)
        {
            this.inputInfos = inputInfos;
            this.errorInfos = errorInfos;
            this.returnCode = returnCode;
        }

        public Result()
        {

        }

        @Override
        public String toString()
        {
            return "Result [inputInfos=" + inputInfos + ", errorInfos=" + errorInfos + ", returnCode=" + returnCode + "]";
        }

        public boolean isSuccess(Judege j)
        {
            if (errorInfos == null || inputInfos == null || returnCode == -1)
            {
                return false;
            }
            return j.isSuccess(inputInfos, errorInfos, returnCode);
        }

        /**
         * 判断结果接口可以通用化判断,防止组内人胡编乱写
         */
        interface Judege
        {
            public boolean isSuccess(List<String> inputInfos, List<String> errorInfos, int returnCode);
        }
    }

    public static void main(String[] args)
    {
        ProcessRunner runner = ProcessUtil.buildProcessRunner();
        Result result = runner.runCMD(Arrays.asList("cmd", "/C", "ping 127.0.0.1 -n 1"));
        System.out.println(result);
        boolean isRight = result.isSuccess(new Judege()
        {
            @Override
            public boolean isSuccess(List<String> inputInfos, List<String> errorInfos, int returnCode)
            {
                return returnCode == 0 && errorInfos.size() == 0;
            }
        });
        System.out.println("result is " + isRight);
    }

}
点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
2年前
java基础知识随身记
2018年11月12日20:51:35一、基础知识:1、JVM、JRE和JDK的区别:JVM(JavaVirtualMachine):java虚拟机,用于保证java的跨平台的特性。  java语言是跨平台,jvm不是跨平台的。JRE(JavaRuntimeEnvironment):java的运行环境,包括jvmjava的核心类
Wesley13 Wesley13
2年前
java的linux执行的shell
!/bin/sh 该脚本为Linux下启动java程序的通用脚本。即可以作为开机自启动service脚本被调用, 也可以作为启动java程序的独立脚本来使用。   警告!!!:该脚本stop部分使用系统kill命令来强制终止指定的java程序进程。 在杀死进程前,未
待兔 待兔
3年前
Java多态实现原理
Java多态概述多态是面向对象编程语言的重要特性,它允许基类的指针或引用指向派生类的对象,而在具体访问时实现方法的动态绑定。Java对于方法调用动态绑定的实现主要依赖于方法表,但通过类引用调用(invokevirtual)和接口引用调用(invokeinterface)的实现则有所不同。类引用调用的大致过程为:Java编译器将Java源代码编译成c
Stella981 Stella981
2年前
MyBatis接口(Bean)与配置信息(Mapper)绑定
目的MyBatis的XML配置文件解析成JAVA类并在内存中存储,但是在程序运行时需要对应的类去调用,而相应的调用类还没有实例化,现在流行的都是使用Spring去管理需要的对象,Spring提供2种方式,分别为XML与注解。下面来分析调用类的实例化及与配置绑定。1XML方式<bean id"menuMapper" cl
Wesley13 Wesley13
2年前
Java执行shell脚本并返回结果两种方法的完整代码
Java执行shell脚本并返回结果两种方法的完整代码简单的是直接传入String字符串,这种不能执行echo或者需要调用其他进程的命令(比如调用postfix发送邮件命令就不起作用)执行复杂的shell建议使用String\\方式传递(对外可以封装后也传入String字符串)。/运行shell脚本
Wesley13 Wesley13
2年前
Java日期时间API系列31
  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前
Stella981 Stella981
2年前
Shell 脚本 —— java 代码远程调用shell脚本重启 tomcat
个人博客网:https://wushaopei.github.io/(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fwushaopei.github.io%2F)  (你想要这里多有)1、创建maven工程!(https://oscimg.oschin
Stella981 Stella981
2年前
Linux下shell脚本监控Tomcat的状态并实现自动启动
最近公司需要在Linux下监控tomcat的服务,一旦tomcat服务存在异常或者宕机,重启tomcat保证服务的正常运行,由于Linux下有Shell脚本可以实现此效果,下面是Linux下shell脚本监控Tomcat的状态并实现自动启动的步骤。1.编写Shell脚本monitor.sh!/bin/sh\func:自动监控tomcat脚本
Stella981 Stella981
2年前
Linux系统Shell编程——脚本编写思路与过程
!(https://oscimg.oschina.net/oscnet/b5650333a00146298052e4da35a0746d.gif"兔子红箭头引导关注")Linux系统Shell编程——脚本编写思路与过程“前段时间有小伙伴问我一些问题,涉及到shell脚本的编写问题,事后,我深入思考了下,实际生产环境的确也
Wesley13 Wesley13
2年前
mysql数据库备份
importjava.io.BufferedReader;importjava.io.BufferedWriter;importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.io.IOException;i