一 java 调用外部命令的方式

一般调用的方式如下:

  1. Process pid = null;
  2. String[] cmd = { "/bin/sh", "-c", "shellCommand" };
  3. pid = Runtime.getRuntime().exec(cmd);
  4. bufferedReader = new BufferedReader(new InputStreamReader(pid.getInputStream()), 1024);
  5. String line = null;
  6. while (bufferedReader != null && (line = bufferedReader.readLine()) != null) {
  7. System.out.println(line);
  8. }
  9. pid.waitFor();
  10. int success = pid.exitValue();
  11. pid.destroy();// to kill the subprocess

说明:

二 解决process.waitFor(),导致主线程block的状态
原因一般为进程有标准输出和错误输出,一般只操作标准输出,如果有错误输出就会导致主线程阻塞。
<1>使用ProcessBuilder类,设置redirectErrorStream(boolean redirectErrorStream)方法,让错误输出流与标准输出合起来,之后就可以在主线程中来process.getInputStream()就可以获得所有的输出。
  1. String[] cmd = { "/bin/sh", "-c", shellCommand };
  2. Process pid = null;
  3. ProcessBuilder build = new ProcessBuilder(cmd);
  4. build.redirectErrorStream(true);
  5. pid=build.start();
  6. bufferedReader = new BufferedReader(new InputStreamReader(pid.getInputStream()), 1024);
<2>启动其他线程清理输出
写个专门清理输出的线程,然后在调用waitFor之前,启动两个线程负责标准输出与错误输出。
例如:
class StreamGobbler extends Thread  {      InputStream is;      String type;            StreamGobbler(InputStream is, String type)      {          this.is = is;          this.type = type;      }            public void run()      {          try          {              InputStreamReader isr = new InputStreamReader(is);              BufferedReader br = new BufferedReader(isr);              String line=null;              while ( (line = br.readLine()) != null)                  System.out.println(type + ">" + line);                  } catch (IOException ioe)                {                  ioe.printStackTrace();                  }      }  } 

使用方法:

 

Process proc = Runtime.getRuntime().exec("java com.zjdw.course.Assign " + path);  new StreamGobbler(proc.getInputStream(),"INFO").start();  new StreamGobbler(proc.getErrorStream(),"ERROR").start();  int status = proc.waitFor(); 

转载于:https://blog.51cto.com/drizzlewalk/432044

java调用外部命令实例相关推荐

  1. android java调用_关于Android中Java调用外部命令的三种方式

    此所谓三种方式,只是个人认为.本人还是菜鸟初涉,所以有所错误,请指正. 个人认为,Java调用外部命令.无非三种情况: 一.是只执行命令,不考虑返回值. 二.是执行命令的同时,还需要得到返回值. 三. ...

  2. [Java]_[初级]_[如何调用外部命令获取输出并设置它的超时退出]

    场景 在开发Java程序的时候,有时候需要执行外部命令以获取特定信息,但是外部命令执行可能由于某些原因(比如CPU,内存占用高后延迟执行)比正常执行的时间要长,有时候甚至挂起阻塞了Java线程的执行. ...

  3. java 执行外部命令 苹果_Java中执行外部命令

    在项目中执行一个linux的shell脚本,于是需要在java环境下执行外部命令如系统命令.linux命令的需求,本人小小研究了一下,又上网查了一些资料先整理如下. java执行外部命令主要依赖两个类 ...

  4. java 调用window程序_Windows下Java调用可执行文件代码实例

    这篇文章主要介绍了Windows下Java调用可执行文件代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 缘起: 由于没有找到java转换文件 ...

  5. 从Python调用外部命令

    您如何在Python脚本中调用外部命令(就像我在Unix Shell或Windows命令提示符下键入的一样)? #1楼 os.system不允许您存储结果,因此,如果您要将结果存储在某个列表中或sub ...

  6. 调用外部程序处理文件_Python使用内置方法、模块调用外部命令

    导读 Python内置调用外部命令: os.system os.popen os.popen2 os.popen3 os.popen4 commands模块 subprocess模块 在Python3 ...

  7. java调用exe_Windows系统中Java调用cmd命令及执行exe程序的方法

    Java调用cmd命令,并输出显示信息: package com.anxin.cmd.test; import java.io.BufferedReader; import java.io.Input ...

  8. 如何在Python脚本中调用外部命令(就像在linux shell或Windows命令提示符下输入一样)

    如何在Python脚本中调用外部命令(就像在linux shell或Windows命令提示符下输入一样) python标准库中的subprocess可以解决这个问题. from subprocess ...

  9. python 调用外部程序 终端异常_python调用外部命令

    python调用外部命令 os.system: 输出在终端上,捕捉不到 os.popen: 只能捕捉到标准输出,捕捉不到标准错误输出 os.popen2: 返回2个对象,一个是标准输入,一个是标准输出 ...

最新文章

  1. fabric go sdk 依赖的安装_从这些角度看 Go 是一门很棒的语言
  2. 安装python 的包控制mysql的Python脚本与执行系统命令的Python脚本
  3. 纯键盘操作,玩转资源管理器
  4. C++Doubly Linked List双向链表(附完整源码)
  5. c++ vector 初始化_什么?还不懂c++vector的用法,你凭什么勇气来的!
  6. 三. 线程管理之ThreadLocal
  7. 【Docker】WARNING: Published ports are discarded when using host network mode
  8. 比较Apache Hadoop 生态系统中不同的文件格式和存储引擎的性能
  9. 树莓派 摄像头 html5,视频演示如何给树莓派安装摄像头模块
  10. maven使用java8
  11. Mac 安装Yarn
  12. 2018年,数万款小程序暴毙在路上
  13. 小学计算机编程学什么,小学生编程都学什么
  14. itunes未能连接到iphone软件更新服务器,无法联系iphone软件更新服务器,itunes无法联系iphone软件更新服务器解决方法...
  15. 一加6可以刷的rom_一加OnePlus 6刷机包_线刷包_救砖包_官方ROM包_固件包下载- 线刷宝ROM中心...
  16. 【FPGA】实战之创建项目
  17. 机器学习——课后习题解答
  18. FOC 电流采样为什么不准?你忽略了这个细节
  19. Spring整合MyBatis导致一级缓存失效问题
  20. fcntl的详细使用

热门文章

  1. Node.js介绍及安装
  2. [Oracle] 分页查询
  3. 在Tomcat 与weblogic 中的 日志(log4j) 配置系列二(weblogic 应用程序使用log4j)
  4. hashmap java 便利_java HashMap 循环遍历map的方法
  5. php 魔术函数,PHP魔术函数、魔术常量、预定义常量
  6. CodeForces - 93B(贪心+vectorpairint,double +double 的精度操作
  7. 电梯调度 matlab,数学建模电梯调度问题.pdf
  8. jquery 监听返回事件
  9. @RestControllerAdvice与@ControllerAdvice的区别
  10. apache的poi中设置Excel的单元格样式(HSSFCellStyle)和表格(HSSFSheet)