我正在尝试读取cmd命令的结果(例如dir)。创建流程后,我将BufferedReader
与InputStreamReader
结合使用。出于某种原因,即使我知道必须要读取一些输出,BufferedReader
仍然是空的。
以下是我正在使用的代码:
String[] str = new String[] {"cmd.exe", "/c",
"cd", "c:\\",
"dir", "/b", "/s"
};
Runtime rt = Runtime.getRuntime();
try{
Process p = rt.exec(str);
InputStream is =p.getInputStream();
System.out.println(is.available());
InputStreamReader in = new InputStreamReader(is);
StringBuffer sb = new StringBuffer();
BufferedReader buff = new BufferedReader(in);
String line = buff.readLine();
System.out.println(line);
while( line != null )
{
sb.append(line + "\n");
System.out.println(line);
line = buff.readLine();
}
System.out.println( sb );
if ( sb.length() != 0 ){
File f = new File("test.txt");
FileOutputStream fos = new FileOutputStream(f);
fos.write(sb.toString().getBytes());
fos.close();
}
}catch( Exception ex )
{
ex.printStackTrace();
}
答案 0 :(得分:5)
你有:
String[] str = new String[] {"cmd.exe", "/c",
"cd", "c:\\",
"dir", "/b", "/s"
};
这对我来说似乎不对。您不能在一个命令行上将多个命令放到cmd.exe中。那是一个批处理文件。
尝试摆脱cd或dir的所有内容。
编辑:确实:
C:\>cmd.exe /c cd c:\ dir
The system cannot find the path specified.
答案 1 :(得分:1)
可能有错误。在这种情况下,您还应该捕获getErrorStream()
答案 2 :(得分:1)
您正在运行的命令是cmd.exe /c cd c:\ dir /b /s
。我认为这不符合你的期望。
<小时/>
我的意思是你将两个命令连接成一行,Windows shell可能不喜欢这样。尝试像
这样的东西String[] str = new String[] {"cmd.exe", "/c",
"cd", "c:\\", "&&",
"dir", "/b", "/s"
};
&&
将告诉shell执行cd c:\
,然后在第一个命令成功时执行dir /b /s
。