我正在编写一些程序来使用其他命令调用cmd.exe,并使用java收集使用它生成的输出。以下是示例程序 -
public class LoadShell {
public static void main(String[] args) throws Exception {
//Line1
String [] command ={"cmd.exe","/c","dir"};
ProcessBuilder probuilder = new ProcessBuilder( command );
Process process = probuilder.start();
InputStream inputstream1 = process.getInputStream();
InputStreamReader inputstreamreader1 = new InputStreamReader(inputstream1);
BufferedReader bufferedreader = new BufferedReader(inputstreamreader1);
String line="";
while ((line = bufferedreader.readLine()) != null) {
System.out.println(line);
}
}
}
这些程序正如预期的那样正常运行。现在我有一个更简单的要求。我想调用没有任何参数的cmd.exe并将输出收集为String。这是因为我想将进程对象引用和字符串发送到另一个方法,以用于某些项目特定目的。所以我在Line1中修改了我的代码,如下所示 -
public class LoadShell {
public static void main(String[] args) throws Exception {
//Line1
String [] command ={"cmd.exe"};
ProcessBuilder probuilder = new ProcessBuilder( command );
Process process = probuilder.start();
InputStream inputstream1 = process.getInputStream();
InputStreamReader inputstreamreader1 = new InputStreamReader(inputstream1);
BufferedReader bufferedreader = new BufferedReader(inputstreamreader1);
int intch;
String line="";
while ((line = bufferedreader.readLine()) != null) {
System.out.println(line);
}
}
}
但在这种情况下,readLine
方法在打印后无限期挂起 -
Microsoft Windows [Version 6.1.7601] 版权所有(c)2009 Microsoft Corporation。保留所有权利。
所以我也尝试使用BufferedReader
而不是readline
的读取,如下所示 -
while ((intch = bufferedreader.read()) != -1) {
int ch = (char) intch;
System.out.println(ch);
}
但是在读取对应于 -
的字节后,甚至读取都会挂起 Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation. All rights reserved.
有什么方法可以获得下面的完整输出而不会导致我的程序挂起 -
Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation. All rights reserved.
C:\Users\devshankhasharm>
任何想法都会受到赞赏。
答案 0 :(得分:0)
可能是因为没有/c
标志你只是打开一个shell窗口,而外部进程现在位于C:\>
提示符处等待发出命令。既然你从不发送任何东西,它就会坐在那里直到你杀了它。