我有以下代码:
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
可以是任何可执行文件。
答案 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世界有关。)