Java Runtime.exec() 使用

每个 Java 应用程序都有一个 Runtime 类实例,使应用程序能够与其运行的环境相连接。可以通过 getRuntime 方法获取当前运行时。 应用程序不能创建自己的 Runtime 类实例。我们可以通过  Runtime.exec()用来执行外部程序或命令

Runtime.exec() 有四种调用方法
    * public Process exec(String command);
    * public Process exec(String [] cmdArray);
    * public Process exec(String command, String [] envp);
    * public Process exec(String [] cmdArray, String [] envp);


下面通过一个Demo来 展示 如何用Java来调用Windows上的wmic命令来获取系统中当前的进程信息。


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class RuntimeExecTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
		test();
	}
	
	private static void test() {
		
		String[] cmd = new String[] { "cmd.exe", "/C", "wmic process get name" };  
        try {  
            Process process = Runtime.getRuntime().exec(cmd);  
              
            new Thread(new SerializeTask(process.getInputStream())).start();  
            new Thread(new SerializeTask(process.getErrorStream())).start();  
              
            process.getOutputStream().close();  
  
            int exitValue = process.waitFor();  
            System.out.println("返回值:" + exitValue);  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
	}
}

class SerializeTask implements Runnable{
	private InputStream in;
	
	public SerializeTask(InputStream in) {
		this.in = in;
	}

	@Override
	public void run() {
		BufferedReader br = null;
		try {
			br = new BufferedReader(new InputStreamReader(in));  
			String line = null;  
			while ((line = br.readLine()) != null) {  
			    System.out.println(line);  
			}
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			try {
				if(br!=null)
					br.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	
}


注意事项

  • 等待命令执行结束用waitFor(),其返回值就是命令的返回值。
  • 如果出现程序执行被挂起,没有任何反应的情况,是由于没有读取命令子进程的正常输出流或错误输出流导致缓冲区被占满,进程被锁住。这个时候需要把输出流中的内容给读出来。最好的做法是使用两个线程,分别同时读取正常输出流和错误输出流。
  • 执行Windows平台上的命令时使用cmd.exe /C,如cmd.exe /C dir。
  • 记得关闭命令子进程的输出流,通过Process.getOutputStream().close(),这样不会导致命令子进程被锁住。
  • Runtime.exec() 不等同于直接执行command line命令。Runtime.exec()很有局限性,对有些命令不能直接把command line里的内容当作String参数传给exec().比如重定向等命令。举个例子:javap -l xxx > output.txt。这时要用到exec的第二种重载,即input 参数为String[]:Process p = Runtime.getRuntime().exec(new String[]{"/bin/sh","-c","javap -l xxx > output.txt"});





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值