java exec_使用Java中的Runtime.exec()执行Windows命令

本文详细介绍了如何使用Java的Runtime.exec()方法调用Windows上的wmic命令来获取系统进程信息。关键点包括使用waitFor()等待命令执行结束,通过两个线程分别读取标准输出和错误输出以避免缓冲区被占满导致进程被锁,以及确保关闭输出流。示例代码展示了具体实现。对于可能出现的乱码问题,可以通过指定输入流的字符编码进行解决。
摘要由CSDN通过智能技术生成

http://www.cheng-fu.com/node/92

写这篇博客的出发点是为了回答JavaEye问答频道上面的一个问题,是问如何用Java来调用Windows上的wmic命令来获取系统中当前的进程信息。我的第一印象是用Runtime.exec()肯定是可以的,但一写就发现,事情并没有那么的简单。我又找到了一篇比较老的文章,仔细阅读,才明白了其中的细节。下面是一些要点:

等待命令执行结束用waitFor(),其返回值就是命令的返回值。

如果出现程序执行被挂起,没有任何反应的情况,是由于没有读取命令子进程的正常输出流或错误输出流导致缓冲区被占满,进程被锁住。这个时候需要把输出流中的内容给读出来。最好的做法是使用两个线程,分别同时读取正常输出流和错误输出流。

执行Windows平台上的命令时使用cmd.exe /C,如cmd.exe /C dir。

记得关闭命令子进程的输出流,通过Process.getOutputStream().close(),这样不会导致命令子进程被锁住。

仿照上面文章中,写了一个简单的例子。

package cmd;

import java.io.BufferedReader;

import java.io.InputStream;

import java.io.InputStreamReader;

class StreamDrainer implements Runnable {

private InputStream ins;

public StreamDrainer(InputStream ins) {

this.ins = ins;

}

public void run() {

try {

BufferedReader reader = new BufferedReader(

new InputStreamReader(ins));

String line = null;

while ((line = reader.readLine()) != null) {

System.out.println(line);

}

} catch (Exception e) {

e.printStackTrace();

}

}

}

public class TestRunCmd {

public static void main(String[] args) {

String[] cmd = new String[] { "cmd.exe", "/C", "wmic process get name" };

try {

Process process = Runtime.getRuntime().exec(cmd);

new Thread(new StreamDrainer(process.getInputStream())).start();

new Thread(new StreamDrainer(process.getErrorStream())).start();

process.getOutputStream().close();

int exitValue = process.waitFor();

System.out.println("返回值:" + exitValue);

} catch (Exception e) {

e.printStackTrace();

}

}

}

分享到:

18e900b8666ce6f233d25ec02f95ee59.png

72dd548719f0ace4d5f9bca64e1d7715.png

2009-08-15 00:33

浏览 16270

评论

3 楼

foible

2013-05-24

lyb520320 写道

非常感谢,你的方法很好用。

不知道返回的流中有乱码的问题怎样解决?

lyb520320 写道

非常感谢,你的方法很好用。

不知道返回的流中有乱码的问题怎样解决?

将输入的流转码即可:

BufferedReader reader = new BufferedReader(

new InputStreamReader(ins),"GBK");

2 楼

foible

2013-05-24

换码即可:BufferedReader r = new BufferedReader(new InputStreamReader(

process.getInputStream(), "gbk"));

1 楼

lyb520320

2011-05-29

非常感谢,你的方法很好用。

不知道返回的流中有乱码的问题怎样解决?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值