转载地址:
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();
}
}
}
分享到:
相关推荐
NULL 博文链接:https://jisonami.iteye.com/blog/2181810
完美解决runtime.exec()执行进程block死锁以及为waitFor设置超时 不需要耗cpu的循环判断exitValue==0 开两个进程搞定
java 执行可执行文件,Runtime.exec、ProcessBuilder、commons-exec
将runtime.exec()的四个陷阱用中文描述
windows环境下IDEA java代码Runtime.getRuntime.exec中shell的执行环境的解决方案前言解决办法后记 前言 在使用IDEA本地开发监控守护线程的后台,我遇上了执行环境不兼容的问题,爆出各种“xxx不是内部或外部命令,...
System.Runtime.Serialization.dll System.Runtime.Serialization.dll System.Runtime.Serialization.dll
Runtime 执行bat
在本篇文章里小编给大家整理的是一篇关于java.lang.Runtime.exec() Payload知识点相关内容,有兴趣的朋友们学习下。
System.Runtime.Serialization.DLL
System.Runtime.InteropServices.APIs.xml
1,申请root权限Runtime.getRuntime().exec("su"); 2,通过数据输出流DataOutputStream写入pm install命令; 3,最后获取Process进程的返回值int i = process.waitFor();,如果i=0,则表明已获取root权限。
System.Runtime.InteropServices.APIs.dll
halcon-17.12.0.0-windows-runtime.exe
Microsoft.NET.Native.Runtime.2.2_2.2.28604.0_x64__8wekyb3d8bbwe
内容:vue.js、vue.min.js、vue.common.js、vue.common.dev.js、vue.common.prod.js、vue.esm.browser.js、vue.esm.browser.min.js、vue.runtime.js、vue.runtime.min.js、vue.runtime.esm.js、vue.runtime.common....
Java调用Linux命令 调用Runtime.exec方法将产生一个本地的进程,并返回一个Process子类的实例, (注意:Runtime.getRuntime().exec(command)返回的是一个Process类的实例), 该实例可用于控制进程或取得进程的...
Esri.ArcGISRuntime.100.3.0.nupkg Esri.ArcGISRuntime.LocalServices.100.3.0.nupkg Esri.ArcGISRuntime.Hydrography.100.3.0.nupkg Esri.ArcGISRuntime.UWP.100.3.0.nupkg Esri.ArcGISRuntime.Xamarin.Forms.100.3...
解决 C# 4.5 使用MongoDB遇到的问题 错误:缺少 System.Runtime.InteropServices.RuntimeInformation.dll version = 4.0.0