设为首页 加入收藏

TOP

Java调用外部程序命令
2014-11-19 11:52:09 】 浏览:7135
Tags:Java 调用 外部 程序 命令

  今天要写个远程重启服务的功能,为了开发速度,暂时定为Java代码+WMIC命令的方法,简单的说,就是利用Java调用本机应用程序的方法。涉及到的 Java类有java.lang包里面的Runtime、Process、ProcessBuilder三个类,以及wmic中重启服务的命令。因为之前 也写过这方面的东西,所以很习惯性的写出了代码:


  Process p = Runtime.getRuntime().exec("wmic ...");


  BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));


  String tmp = null;


  while ((tmp = br.readline()) != null) {


  System.out.println(tmp);


  }


  int exitValue = p.waitfor();


  Process p = Runtime.getRuntime().exec("wmic ..."); BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream())); String tmp = null; while ((tmp = br.readline()) != null) { System.out.println(tmp); } int exitValue = p.waitfor();


  运行,结果发现程序不能退出,Debug发现程序阻塞在br.readline()中了,强制结束程序,发现重启服务的命令正常下下去了,去掉程序中获得标准输出的地方和获得返回结果的地方,命令也能正常下去,而且正常退出。


  为什么程序会阻塞呢?Google了一下,发现了大家的解释,应该也是比较权威的解释吧:每个进程都有自己的标准输入、标准输出、标准错误输出,对于某些依赖于OS的进程,可能其输出缓冲区很小,如果不能及时的读出(标准输出、标注错误输出),将导致进程不能正常退出。我的程序中标准输出已经读了,显然原因不是这个,难道是错误输出缓冲区中的数据没有读出导致的?带着这个疑问,对程序作了一些更改:


  ProcessBuilder pb = new ProcessBuilder("wmic",...);


  pb.redirectErrorStream(true);


  Process p = pb.start();


  BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));


  String tmp = null;


  while ((tmp = br.readline()) != null) {


  System.out.println(tmp);


  }


  int exitValue = p.waitfor();


  ProcessBuilder pb = new ProcessBuilder("wmic",...); pb.redirectErrorStream(true); Process p = pb.start(); BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream())); String tmp = null; while ((tmp = br.readline()) != null) { System.out.println(tmp); } int exitValue = p.waitfor();


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇二级Java考试辅导教程:8.2基于UR.. 下一篇归纳一些取Java绝对路径的方法

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目