如何从java代码获取console命令的结果?

时间:2017-03-24 13:57:51

标签: java

我有以下代码:

ProcessBuilder pb = new ProcessBuilder("dir"); // or cat in linux
Process p = pb.start();
p.waitFor();
String result = IOUtils.toString(p.getInputStream(), "UTF-8");
System.out.println(result);

它抛出

java.io.IOException: Cannot run program "dir": CreateProcess error=2, The system cannot find the file specified
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048) ~[na:1.8.0_111]

我知道我可以这样写:

ProcessBuilder pb = new ProcessBuilder("test.bat");

,在test.bat内你可以写

dir

但它返回:

D:\nsd-rest>dir
 Volume in drive D is SECOND
 Volume Serial Number is CE52-8896

 Directory of D:\nsd-rest

03/24/17  15:53    <DIR>          .
03/24/17  15:53    <DIR>          ..
03/24/17  12:00               249 .gitignore
03/24/17  16:54    <DIR>          .idea
03/24/17  15:01    <DIR>          .mvn
03/24/17  12:00             7,058 mvnw
03/24/17  12:00             5,006 mvnw.cmd
03/24/17  15:53             6,265 nsd-rest.iml
03/24/17  15:52             1,993 pom.xml
03/24/17  15:01    <DIR>          src
03/24/17  15:19    <DIR>          target
03/24/17  16:52                 3 test.bat
               6 File(s)         20,574 bytes
               6 Dir(s)  587,412,844,544 bytes free

D:\nsd-rest>dir

是多余的。

当我调用bat文件时,我觉得我做错了。

您能提供正确的解决方案吗?

P.S。而不是dir可以是任何可执行文件。

1 个答案:

答案 0 :(得分:1)

实际上没有dir个可执行文件 - 例如你无法在Windows上的任何地方找到dir.exe。这是伪命令,仅存在于cmd.exe可执行上下文中。

如果您想获得“dir”输出 - 您只需运行cmd.exe /c dir

即可

你的程序中也存在错误:

p.waitFor();
String result = IOUtils.toString(p.getInputStream(), "UTF-8");

如果程序输出足够大并且不适合输出缓冲区,p.waitFor()永远不会结束 - 因为缓冲区溢出而没有人正在读取它。我建议交换这些行(或者甚至更好 - 阅读关于进程间IO的几篇文章,这些内容只与Java世界有关。)