首页 > 编程语言 >java - 调window系统指令的三种方式

java - 调window系统指令的三种方式

时间:2023-04-19 18:55:18浏览次数:35  
标签:java process try window 指令 catch new readLine null

方法1

        try {
            Process process = Runtime.getRuntime().exec(command);
            int resultCode = process.waitFor();
            System.out.println(resultCode);
        } catch (Exception e) {
            e.printStackTrace();
            msg = ExceptionUtils.getErrorStackTrace(e);
        }

方法2

  Process process = null;
        try {
            ProcessBuilder pb = new ProcessBuilder();
            //指令太长会导致无法找到文件,被视为一个完整的指令,应该每个空格都是为一个指令
            List<String> ls = new ArrayList<>(Arrays.asList(command.split(" ")));
            pb.command(ls);
            //processBuilder支持将inputStream与ErrorStream合并为一个Stream,即所有的输出信息都合并到inputStream中,这样做可以减少一个线程
            pb.redirectErrorStream(true);
            process = pb.start();
            //由于process机制原因会导致死锁,所以需要在waitfor方法之前,创建线程用于处理inputstream中缓冲区的数据,这也是为什么要合并inputstream和errorstream的原因,在这里可以少创建一个线程
            readInputStream(process.getInputStream());
            //返回0则表示输出正常
            int resultCode = process.waitFor();
        } catch (Exception e) {
            e.printStackTrace();
            msg = ExceptionUtils.getErrorStackTrace(e);
        } finally {
            try {
                if (null != process) {
                    process.getErrorStream().close();
                    process.getInputStream().close();
                    process.getOutputStream().close();
                }
            } catch (Exception ignored) {
            }
        }

private static ExecutorService executor;

static {
//创建线程池
executor = Executors.newFixedThreadPool(10);
}


//创建线程处理输出流 private static void readInputStream(InputStream in) { executor.execute(new Runnable() { @Override public void run() { InputStreamReader reader = null; try { reader = new InputStreamReader(in); LineNumberReader line = new LineNumberReader(reader); String str = null; while ((str = line.readLine()) != null) { System.out.println(str); } } catch (Exception e) { e.printStackTrace(); } finally { try { if (reader != null) { reader.close(); } } catch (IOException e) { e.printStackTrace(); } } } }); }

方法3

 public static boolean runCMD(String cmd) throws IOException, InterruptedException {
        Process p = Runtime.getRuntime().exec(cmd);
        BufferedReader br = null;
        try {
            br = new BufferedReader(new InputStreamReader(p.getInputStream()));
            String readLine = br.readLine();
            StringBuilder builder = new StringBuilder();
            while (readLine != null) {
                readLine = br.readLine();
                builder.append(readLine);
            }
            p.waitFor();
            int i = p.exitValue();
            return i == 0;
        } catch (Exception e) {
            e.printStackTrace();
            throw e;
        } finally {
            if (br != null) {
                br.close();
            }
        }
    }
 try {
            runCMD(command);
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }

 

标签:java,process,try,window,指令,catch,new,readLine,null
From: https://www.cnblogs.com/c2g5201314/p/17334340.html

相关文章

  • Windows 10开发教程_编程入门自学教程_菜鸟教程-免费教程分享
    教程简介Windows10开发入门教程-从简单的步骤了解Windows10开发,从基本到高级概念,包括简介,UWP,第一个应用程序,商店,XAML控件,数据绑定,XAML性能,自适应设计,自适应UI,自适应代码,文件管理,SQLite数据库,应用程序到应用程序通信,应用程序本地化,应用程序生命周期,后台执行,应用服务,Web平台,连接......
  • 图数据库 NebulaGraph 的 Java 数据解析实践与指导
    如何快速、即时、符合直觉地去处理NebulaJavaClient中的数据解析?读这一篇就够了。图数据库NebulaGrpah的论坛和微信群里,有不少用户问及了Java客户端数据解析的问题。在本文教你一种简单的方式同返回结果交互,快速、即时地拿到解析数据。愉快、干净的Java交互环境本......
  • Windows 10开发教程_编程入门自学教程_菜鸟教程-免费教程分享
    教程简介Windows10开发入门教程-从简单的步骤了解Windows10开发,从基本到高级概念,包括简介,UWP,第一个应用程序,商店,XAML控件,数据绑定,XAML性能,自适应设计,自适应UI,自适应代码,文件管理,SQLite数据库,应用程序到应用程序通信,应用程序本地化,应用程序生命周期,后台执行,应用服务,Web平台,连......
  • 重学Java设计模式-行为型模式-中介者模式
    重学Java设计模式-行为型模式-中介者模式内容摘自:https://bugstack.cn/md/develop/design-pattern/2020-06-27-重学Java设计模式《实战中介者模式》.html#重学-java-设计模式-实战中介者模式「按照mybatis原理手写orm框架-给jdbc方式操作数据库增加中介者场景」中介者模式介绍......
  • Java之Lambda使用
    目录Java之Lambda使用流操作1.Java中filter和removeIf.2.Java中forEach使用.3.Java中Peek使用.4.Java中Map使用.5.Java中MapTo...使用.6.Java中Distinct使用.7.Java中Sorted使用.8.Java中skip使用.非流操作9.Java中groupingBy使用.10.Java中Collect使用.11.Java中FindFirst、findA......
  • javasec(四)序列化与反序列化基本原理
    title:javasec(四)序列化与反序列化基本原理tags:-javasec-反序列化categories:-javaseccover:'https://blog-1313934826.cos.ap-chengdu.myqcloud.com/blog-images/1.jpeg'feature:falsedate:2023-04-1816:02:20这篇文章介绍java序列化与反序列化基本原......
  • javasec(一)java反射
    这篇文章介绍javasec基础知识--java反射。0x01反射是什么?反射是一种机制,利用反射机制动态的实例化对象、读写属性、调用方法、构造函数。在程序运行状态中,对于任意一个类或对象,都能够获取到这个类的所有属性和方法(包括私有属性和方法),这种动态获取信息以及动态调用对象方法的......
  • javasec(五)URLDNS反序列化分析
    这篇文章介绍URLDNS就是ysoserial中⼀个利⽤链的名字,但准确来说,这个其实不能称作“利⽤链”。因为其参数不是⼀个可以“利⽤”的命令,⽽仅为⼀个URL,其能触发的结果也不是命令执⾏,⽽是⼀次DNS请求。ysoserial打包成jar命令mvncleanpackage-DskipTests,刚刚入门所以用这条链作......
  • javasec(六)RMI
    这篇文章介绍java-RMI远程方法调用机制。RMI全称是RemoteMethodInvocation,远程⽅法调⽤。是让某个Java虚拟机上的对象调⽤另⼀个Java虚拟机中对象上的⽅法,只不过RMI是Java独有的⼀种RPC方法。看这篇之前可以先去看看RPC:https://www.bilibili.com/video/BV1zE41147Zq?from=searc......
  • 2023年windows DockerDeskTop最新款4.18.0 全程保姆级安装
    目录前景提示windows10内置的linux系统1.这个内置系统一定要在windowsstore里安装,否则,无法使用,这是重点。进入商店,搜索linux。2.一般画圈这些都可以使用。4.安装会让你输入微软账户密码(首次)。5.静静等待,本作的这个大概550M左右。6.装好后,会生成一个图标(像应用程序一样,双击......