Java执行cmd命令两种实现方法解析

 更新时间:2020年07月28日 11:58:54   作者:张志勇-  
这篇文章主要介绍了Java执行cmd命令两种实现方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

一般java在执行CMD命令时,通常是使用Runtime.getRuntime.exec(command)来执行的,这个方法有两种细节要注意:

1.一般执行方法,代码如下,这种方法有时执行exe时会卡在那里。

//一般的执行方法,有时执行exe会卡在那  stmt要执行的命令
  public static void executive(String stmt) throws IOException, InterruptedException {
    Runtime runtime = Runtime.getRuntime(); //获取Runtime实例
    //执行命令
    try {
      String[] command = {"cmd", "/c", stmt};
      Process process = runtime.exec(command);
      // 标准输入流(必须写在 waitFor 之前)
      String inStr = consumeInputStream(process.getInputStream());
      // 标准错误流(必须写在 waitFor 之前)
      String errStr = consumeInputStream(process.getErrorStream());
      new ProcessClearStream(process.getInputStream(), "INFO").start();
      new ProcessClearStream(process.getErrorStream(), "ERROR").start();
      int proc = process.waitFor();
      InputStream errorStream = process.getErrorStream(); //若有错误信息则输出
      if (proc == 0) {
        System.out.println("执行成功");
      } else {
        System.out.println("执行失败" + errStr);
      }
    } catch (IOException | InterruptedException e) {
      e.printStackTrace();
    }
  }

  /**
   * 消费inputstream,并返回
   */
  public static String consumeInputStream(InputStream is) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(is,"GBK"));
    String s;
    StringBuilder sb = new StringBuilder();
    while ((s = br.readLine()) != null) {
      System.out.println(s);
      sb.append(s);
    }
    return sb.toString();
  }

2.第二种方法是先生成一个缓存文件,用来缓存执行过程中输出的信息,这样在执行命令的时候不会卡。代码如下:

//这个方法比第一个好,执行时不会卡 stmt要执行的命令
  public static void aaa(String stam){
    BufferedReader br = null;
    try {
      File file = new File("D:\\daemonTmp");
      File tmpFile = new File("D:\\daemonTmp\\temp.tmp");//新建一个用来存储结果的缓存文件
      if (!file.exists()){
        file.mkdirs();
      }
      if(!tmpFile.exists()) {
        tmpFile.createNewFile();
      }
      ProcessBuilder pb = new ProcessBuilder().command("cmd.exe", "/c", stam).inheritIO();
      pb.redirectErrorStream(true);//这里是把控制台中的红字变成了黑字,用通常的方法其实获取不到,控制台的结果是pb.start()方法内部输出的。
      pb.redirectOutput(tmpFile);//把执行结果输出。
      pb.start().waitFor();//等待语句执行完成,否则可能会读不到结果。
      InputStream in = new FileInputStream(tmpFile);
      br= new BufferedReader(new InputStreamReader(in));
      String line = null;
      while((line = br.readLine()) != null) {
        System.out.println(line);
      }
      br.close();
      br = null;
      tmpFile.delete();//卸磨杀驴。
      System.out.println("执行完成");
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      if(br != null) {
        try {
          br.close();
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
    }
  }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • IDEA部署Tomcat的超详细图文教程

    IDEA部署Tomcat的超详细图文教程

    最近迫于无奈从我哪破旧的Eclipse转换到了IDEA,然后就是超多的不习惯,下面这篇文章主要给大家介绍了关于IDEA部署Tomcat的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-02-02
  • Java 批量获取地址间距离工具(支持中转站)

    Java 批量获取地址间距离工具(支持中转站)

    本文主要介绍了Java批量获取地址间距离,获取两个地址间距离,实现方式比较多,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • 浅谈Spring Boot 异常处理篇

    浅谈Spring Boot 异常处理篇

    本篇文章主要介绍了浅谈Spring Boot 异常处理篇,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • 深入浅析springboot中static和templates区别

    深入浅析springboot中static和templates区别

    这篇文章主要介绍了springboot中static和templates区别,本文通过图文实例代码相结合给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • Spring中@Scheduled和HttpClient的连环坑

    Spring中@Scheduled和HttpClient的连环坑

    这篇文章主要给大家介绍了关于Spring中@Scheduled和HttpClient的连环坑,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-03-03
  • Java通过百度地图API获取定位(普通IP定位)的方法教程

    Java通过百度地图API获取定位(普通IP定位)的方法教程

    这篇文章主要介绍了Java通过百度地图API获取定位的方法教程,首先说明了实现这个功能的需求和初衷,然后详细描述了利用百度地图API实现这个功能的步骤,包括在百度地图开放平台的准备工作、学习官网API文档、修改API的AK配置、Java代码获取定位等,需要的朋友可以参考下
    2024-11-11
  • java执行Linux命令的方法

    java执行Linux命令的方法

    这篇文章主要介绍了java执行Linux命令的方法,涉及对Java中Runtime.exec()函数的应用,具有一定的参考借鉴价值,需要的朋友可以参考下
    2014-11-11
  • idea类名显示多行的设置方式

    idea类名显示多行的设置方式

    在IntelliJ IDEA中,类名的显示方式可以通过设置来调整,若想设置为单行显示,需在设置中找到相关选项并勾选“√”,若需多行显示,则取消勾选即可,此操作有助于优化代码视图,提升开发效率
    2024-09-09
  • SpringBoot中@ComponentScan的使用详解

    SpringBoot中@ComponentScan的使用详解

    这篇文章主要介绍了SpringBoot中@ComponentScan的使用详解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • 关于Java的二叉树、红黑树、B+树详解

    关于Java的二叉树、红黑树、B+树详解

    这篇文章主要介绍了关于Java的二叉树、红黑树、B+树详解,能同时具备数组查找快的优点以及链表插入和删除快的优点的数据结构就是树,需要的朋友可以参考下
    2023-05-05

最新评论