`
walsh
  • 浏览: 433080 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

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

    博客分类:
  • java
阅读更多
转载地址: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();
		}

	}

}
分享到:
评论
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  
非常感谢,你的方法很好用。
不知道返回的流中有乱码的问题怎样解决?

相关推荐

    Java使用Runtime.exec()给Windows命令提示符做了个外壳,真的很山寨!

    这篇博客"Java使用Runtime.exec()给Windows命令提示符做了个外壳,真的很山寨!"探讨了如何利用`Runtime.exec()`来创建一个简单的命令行界面,尽管这种方式可能并不完美,但不失为一种学习和实践的方法。 `Runtime....

    Runtime 执行bat

    通过以上知识点,我们可以理解如何在Java中使用`Runtime`类来执行bat脚本,以及执行过程中需要注意的事项。在实际开发中,根据项目需求,可以选择使用`Runtime`或`ProcessBuilder`,并且始终要关注安全性。

    java调用windows命令

    在Java编程中,有时我们需要在程序中调用Windows系统的命令行操作,例如执行外部程序、系统命令或者进行文件操作。Java提供了Runtime类和Process类来实现这一功能。以下是如何使用Java调用Windows命令行的详细步骤和...

    【IDEA】windows环境下IDEA java代码Runtime.getRuntime.exec中shell的执行环境的解决方案

    windows环境下IDEA java代码Runtime.getRuntime.exec中shell的执行环境的解决方案前言解决办法后记 前言 在使用IDEA本地开发监控守护线程的后台,我遇上了执行环境不兼容的问题,爆出各种“xxx不是内部或外部命令,...

    Java调用应用程序和Dos中的命令

    本文将详细介绍如何使用Java来调用应用程序以及如何在Windows操作系统中调用DOS命令。 #### 一、Java调用应用程序的基本概念 在Java中,`java.lang.Runtime`类提供了与当前运行时系统交互的方法,其中包括`exec()`...

    解决java执行cmd命令调用ffmpeg报错Concat error - No such filter '[0,0]'问题

    然而,在Java中通过`Runtime.getRuntime().exec()`或`ProcessBuilder`执行命令时,可能还会遇到问题,因为这些方法在处理命令行参数时有自己的规则。在某些情况下,即使在DOS窗口中可以成功执行的命令,通过Java执行...

    java 调用doc命令

    在Java中,我们可以通过`Runtime.exec()`或`ProcessBuilder`类来执行这样的系统命令。 首先,让我们详细了解一下`Runtime.exec()`方法。这个方法允许Java程序在运行时执行外部程序或命令。例如,如果我们要在CMD中...

    JAVA执行DOS命令分析

    在Java中,我们使用`Runtime.exec()`,而在C#中,我们可以使用`System.Diagnostics.Process`类。虽然两者都提供了执行外部命令的能力,但在具体实现和异常处理上可能存在差异,需要根据具体场景进行适配。 总结来说...

    Java执行DOS命令

    在上述代码中,我们使用了`Runtime.getRuntime().exec()`方法执行了"dir"命令,这是在Windows环境下列出当前目录下所有文件和目录的命令。然后,我们通过`BufferedReader`读取命令执行的输出并打印到控制台。 但是...

    java调用本地浏览器的demo

    首先,`Runtime.getRuntime().exec()`方法是Java标准库中用于执行系统命令的常用方式。例如,如果你想在Windows环境下打开默认浏览器,你可以这样写: ```java String url = "http://www.example.com"; Runtime....

    JAVA得到网卡物理地址(windows和Linux)

    我们可以使用 Java 的 Runtime.getRuntime().exec() 方法来执行 ipconfig 命令,并将结果解析出来获取网卡物理地址。下面是一个示例代码: ```java public final static String getMacAddress() throws IOException ...

    java系统命令调用

    本文将详细介绍如何使用Java Runtime类中的`getRuntime().exec()`方法来调用系统命令,并提供一些实际应用场景的例子。 ### Java Runtime.getRuntime().exec() `java.lang.Runtime`类提供了运行时系统的表示形式,...

    java调用播放器

    ### Java调用播放器知识点详解 #### 一、概述 ...通过上述内容,我们可以了解到如何在Java中使用`Runtime.exec()`方法来调用播放器以及执行其他系统命令。这对于开发具有多媒体功能的应用程序非常有用。

    java 以管理员身份调用cmd 需要用到的文件

    3. **使用Java的Runtime类**:在Java中,可以使用`Runtime.getRuntime().exec()`方法来执行命令。例如: ```java String command = "nircmd.exe elevate ipconfig /all"; Process process = Runtime.getRuntime()....

    java 使用dos命令详解

    在Java开发过程中,有时候我们需要执行一些特定的操作系统命令来完成特定的任务,尤其是在Windows平台上。本文将详细介绍如何在Java中调用DOS命令,并通过具体的示例来阐述这一过程。 #### 一、Java调用DOS命令的...

    java控制台输入cmd命令, ssh远程linux shell命令, 并打印命令输出到控制台

    在Java中,我们可以使用`Runtime`类或者`ProcessBuilder`类来执行系统命令。这里以`Runtime`为例: ```java import java.io.BufferedReader; import java.io.InputStreamReader; public class CmdExecutor { ...

    java 调用 windows cmd 命令

    在Java编程中,有时我们需要与操作系统进行交互,执行一些系统级别的命令,比如Windows下的CMD命令。这通常是通过Java的Runtime类或者ProcessBuilder类来实现的。这篇博客文章"java 调用 windows cmd 命令"可能详细...

    java修改文件属性

    2. **使用外部命令设置文件属性**:使用`Runtime.getRuntime().exec()`执行外部命令。 - **设置文件为只读**: ```java Runtime runtime = Runtime.getRuntime(); String command = "attrib \"" + file....

Global site tag (gtag.js) - Google Analytics