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();
        }
      }
    }
  }

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

相关文章

  • Java NIO实战之聊天室功能详解

    Java NIO实战之聊天室功能详解

    这篇文章主要介绍了Java NIO实战之聊天室功能,结合实例形式详细分析了java NIO聊天室具体的服务端、客户端相关实现方法与操作注意事项,需要的朋友可以参考下
    2019-11-11
  • Java Lambda表达式和函数式接口实例分析

    Java Lambda表达式和函数式接口实例分析

    这篇文章主要介绍了Java Lambda表达式和函数式接口,结合实例形式分析了Java8 Lambda表达式和函数式接口相关原理、用法及操作注意事项,需要的朋友可以参考下
    2019-09-09
  • screw Maven插件方式运行时在编译打包时跳过执行的问题解决方法

    screw Maven插件方式运行时在编译打包时跳过执行的问题解决方法

    这篇文章主要介绍了screw Maven插件方式运行时在编译打包时跳过执行的问题解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03
  • 关于在IDEA热部署插件JRebel使用问题详解

    关于在IDEA热部署插件JRebel使用问题详解

    这篇文章主要介绍了关于在IDEA热部署插件JRebel使用问题详解,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • 聊聊Spring循环依赖三级缓存是否可以减少为二级缓存的情况

    聊聊Spring循环依赖三级缓存是否可以减少为二级缓存的情况

    这篇文章主要介绍了聊聊Spring循环依赖三级缓存是否可以减少为二级缓存的情况,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • SpringBoot如何访问不同的数据库的方法实现

    SpringBoot如何访问不同的数据库的方法实现

    本文主要介绍了在SpringBoot应用中配置和管理多个数据源的方法,包括使用SpringBoot官方支持的配置方式和第三方库实现多数据源配置,感兴趣的可以了解一下
    2024-11-11
  • idea普通javaweb项目如何部署到tomcat(读取web.xml文件)

    idea普通javaweb项目如何部署到tomcat(读取web.xml文件)

    这篇文章主要介绍了idea普通javaweb项目如何部署到tomcat(读取web.xml文件),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • MyBatis-Plus 实体类注解的实现示例

    MyBatis-Plus 实体类注解的实现示例

    MyBatis-Plus作为MyBatis的增强版,提供了一系列实用的注解,如@TableName、@TableId、@TableField等,旨在简化数据库和Java实体类之间的映射及CRUD操作,通过这些注解,开发者可以轻松实现表映射、字段映射、逻辑删除、自动填充和乐观锁等功能
    2024-09-09
  • 详解利用SpringCloud搭建一个最简单的微服务框架

    详解利用SpringCloud搭建一个最简单的微服务框架

    这篇文章主要介绍了详解利用SpringCloud搭建一个最简单的微服务框架,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • 数据定位在java购物车系统中的应用

    数据定位在java购物车系统中的应用

    实现"加入购物车"功能,数据定位至关重要,它通过用户ID和商品ID等标识符实现快速查询和数据一致性,主键、外键和联合索引等数据库技术,以及Redis缓存和并发控制策略如乐观锁或分布式锁,共同保障了购物车系统的查询效率和数据安全,这些机制对高并发和大数据量的场景尤为重要
    2024-10-10

最新评论