精华帖 (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 命令,为啥就有这样的区别呢?大家发表下自己的看法?谢谢!
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-06-29
看半天,原来楼主所谓“DOC”是“DOS”的误写啊!
|
|
返回顶楼 | |
发表时间:2009-06-29
yiding_he 写道 看半天,原来楼主所谓“DOC”是“DOS”的误写啊! 呵呵,不好意识,写错了,改之!上面的现象大哥你知道为什么吗? |
|
返回顶楼 | |
发表时间:2009-06-29
这个并不是java执行不了,执行应该没问题。 应该是BufferedReader 该类的缓冲太小,无法读取该内容。 可以看下 br.ready() 方法返回是否可读。 如果为false,就无法读取了,可以试着换其它类进行读取。 |
|
返回顶楼 | |
发表时间:2009-06-30
myworkfirst 写道 这个并不是java执行不了,执行应该没问题。 应该是BufferedReader 该类的缓冲太小,无法读取该内容。 可以看下 br.ready() 方法返回是否可读。 如果为false,就无法读取了,可以试着换其它类进行读取。 非常感谢这位兄弟的帮助提醒,我来试试看啊!有消息在告诉你!谢谢! |
|
返回顶楼 | |
发表时间:2009-06-30
最后修改:2009-06-30
chenhua_1984 写道
myworkfirst 写道
这个并不是java执行不了,执行应该没问题。 应该是BufferedReader 该类的缓冲太小,无法读取该内容。 可以看下 br.ready() 方法返回是否可读。 如果为false,就无法读取了,可以试着换其它类进行读取。 非常感谢这位兄弟的帮助提醒,我来试试看啊!有消息在告诉你!谢谢!
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(); } } }
|
|
返回顶楼 | |
发表时间: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(); } } } |
|
返回顶楼 | |
发表时间: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); } |
|
返回顶楼 | |
发表时间: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呢? |
|
返回顶楼 | |
发表时间:2009-06-30
虽然命令执行了,但InputStream流里并没有数据,该对象的内存空间,并没有取到任何数据。
InputStream 默认给了8192个byte,read(byte[]) 里,走不进去,看了jdk源码,没有找到InputStream 里是为空数据原因。 再跟踪下jdk源码,看看是否知道原因 |
|
返回顶楼 | |