论坛首页 Java企业应用论坛

讨论:java调用windows 下dos命令wmic的奇怪现象

浏览 25666 次
精华帖 (0) :: 良好帖 (7) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-06-29   最后修改:2010-06-03

   java 与外部进程通信。 由于java 是跨平台的,有时候我们需要用到操作系统的一些信息,为了方便期间,干脆就直接调用操作系统的命令来实现,比如查看IP地址,MAC地址等。不过两个在jdk6里面已经有了,不过以前都是用调用dos 命令,然后获取输出的办法来做的,比如:

import java.io.*;
public class DT {
      public static void main(String[] args) throws IOException
      {
      String command="ipconfig";
      Runtime r=Runtime.getRuntime();
      Process p=r.exec(command);
      BufferedReader br=new BufferedReader(new InputStreamReader(p.getInputStream()));
      StringBuffer sb=new StringBuffer();
      String inline;
      while(null!=(inline=br.readLine())){
      sb.append(inline).append("\n");
      }
      System.out.println(sb.toString());
      }
}

 这样的话可以得到如下的结果:

Windows IP Configuration
Ethernet adapter VMware Network Adapter VMnet8:



   Connection-specific DNS Suffix  . :

   IP Address. . . . . . . . . . . . : 192.168.79.1

   Subnet Mask . . . . . . . . . . . : 255.255.255.0

   Default Gateway . . . . . . . . . :



Ethernet adapter VMware Network Adapter VMnet1:



   Connection-specific DNS Suffix  . :

   IP Address. . . . . . . . . . . . : 192.168.23.1

   Subnet Mask . . . . . . . . . . . : 255.255.255.0

   Default Gateway . . . . . . . . . :



Ethernet adapter 本地连接:



   Connection-specific DNS Suffix  . :

   IP Address. . . . . . . . . . . . : 192.168.100.12

   Subnet Mask . . . . . . . . . . . : 255.255.255.0

   Default Gateway . . . . . . . . . : 192.168.100.250

 然而,当我在执行wmic 命令的时候,想要获取它的输出确不行了,看代码:

package test;

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

public class ManagerArgs {

	public static void main(String[] args) {
		try {
		
			Process p = Runtime.getRuntime().exec("cmd.exe /c wmic process get name,executablepath");
		
			BufferedReader br = new BufferedReader(new InputStreamReader(p
					.getInputStream()));
			String line = "";
			while ((line = br.readLine()) != null) {
				System.out.println(line);
			}
			br.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

 程序在执行的时候就柱塞 了,根本获取不到想ipconfig 那样的结果,把命令放到DOS 命令里面取执行,看图片:


这里确实可以的。难道wmic 命令的结果java 就取不到了吗?同样的都是dos 命令,为啥就有这样的区别呢?大家发表下自己的看法?谢谢!

 

  • 大小: 140.8 KB
   发表时间:2009-06-29  
看半天,原来楼主所谓“DOC”是“DOS”的误写啊!
0 请登录后投票
   发表时间:2009-06-29  
yiding_he 写道
看半天,原来楼主所谓“DOC”是“DOS”的误写啊!

呵呵,不好意识,写错了,改之!上面的现象大哥你知道为什么吗?
0 请登录后投票
   发表时间:2009-06-29  

   这个并不是java执行不了,执行应该没问题。 应该是BufferedReader 该类的缓冲太小,无法读取该内容。 可以看下 br.ready() 方法返回是否可读。

    如果为false,就无法读取了,可以试着换其它类进行读取。
0 请登录后投票
   发表时间:2009-06-30  
myworkfirst 写道

   这个并不是java执行不了,执行应该没问题。 应该是BufferedReader 该类的缓冲太小,无法读取该内容。 可以看下 br.ready() 方法返回是否可读。

    如果为false,就无法读取了,可以试着换其它类进行读取。

非常感谢这位兄弟的帮助提醒,我来试试看啊!有消息在告诉你!谢谢!
0 请登录后投票
   发表时间:2009-06-30   最后修改:2009-06-30
chenhua_1984 写道
myworkfirst 写道

   这个并不是java执行不了,执行应该没问题。 应该是BufferedReader 该类的缓冲太小,无法读取该内容。 可以看下 br.ready() 方法返回是否可读。

    如果为false,就无法读取了,可以试着换其它类进行读取。

非常感谢这位兄弟的帮助提醒,我来试试看啊!有消息在告诉你!谢谢!


我用这段代码试试,还是不行啊,读不到数据!input.available();返回值为零!

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

public class CallDoc {

	public static void main(String[] args) {
		try {
			
			Process p=Runtime.getRuntime().exec("cmd.exe /c wmic process");
			InputStream input=p.getInputStream();
			int a=input.available();
			byte[] b=new byte[a];
			while(input.read()!=-1){
				input.read(b);
			}
			input.close();
			System.out.println(b.toString());
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}
 

 

0 请登录后投票
   发表时间:2009-06-30   最后修改:2009-06-30
你需要关闭OutputStream。

p.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();
		}

	}

}


1 请登录后投票
   发表时间:2009-06-30   最后修改:2009-06-30
alexcheng 写道
你需要关闭OutputStream。

p.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();
		}

	}

}



很好!兄弟你说得对!可以了!呵呵谢谢!
String command = "cmd.exe /c wmic process where name='smss.exe' get name,processid ,executablepath";
Runtime r = Runtime.getRuntime();
Process p = r.exec(command);
BufferedReader br = new BufferedReader(new InputStreamReader(p
.getInputStream()));

p.getOutputStream().flush();
p.getOutputStream().close();
String message="";
while((message = br.readLine())!= null){
System.out.println(message);
}
0 请登录后投票
   发表时间:2009-06-30  
alexcheng 写道
你需要关闭OutputStream。

p.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();
		}

	}

}



但是为什么需要flush和close呢?
0 请登录后投票
   发表时间:2009-06-30  
    虽然命令执行了,但InputStream流里并没有数据,该对象的内存空间,并没有取到任何数据。

  InputStream 默认给了8192个byte,read(byte[]) 里,走不进去,看了jdk源码,没有找到InputStream 里是为空数据原因。
    
    再跟踪下jdk源码,看看是否知道原因
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics