我正在尝试使用cmd.exe搜索特定目录中的文件,然后在java程序中显示该路径并将其写入文件。问题是该过程永远不会终止。
这是我的代码:
String[] str = new String[] { "cmd.exe ", "cd c:\\",
" dir /b /s documents", "2>&1" };
Runtime rt = Runtime.getRuntime();
try{
Process p = rt.exec(str);
InputStream is =p.getInputStream();
InputStreamReader in = new InputStreamReader(is);
StringBuffer sb = new StringBuffer();
BufferedReader buff = new BufferedReader(in);
String line = buff.readLine();
while( line != null )
{
sb.append(line + "\n");
line = buff.readLine();
}
System.out.println( sb );
File f = new File("test.txt");
FileOutputStream fos = new FileOutputStream(f);
fos.write(sb.toString().getBytes());
fos.close();
}catch( Exception ex )
{
ex.printStackTrace();
}
答案 0 :(得分:1)
答案 1 :(得分:1)
Runtime.exec
不起作用。您无法将多个命令传递给cmd.exe。
Runtime.exec
允许您使用参数列表执行单个进程。它不提供任何“shell”操作(例如2>&1
)。您必须使用输入/输出流自己进行那种IO重定向。
这与调用另一个程序的main
函数类似。
您可以尝试`Runtime.exec(new String [] {“cmd.exe”,“/ c”,“dir”,“C:\\”});
但实际上,如果你想要文件列表,你最好使用java.io.File
类中的设施,这不依赖于操作系统特定的功能。
答案 2 :(得分:0)
为什么不使用Java to do directory traversal而不是调用外部shell命令?它使你的代码不可移植!
答案 3 :(得分:0)
在启动命令之前,除了使用/ C或/ K开关的cmd.exe进程外,还必须使用start命令。示例:要在bash控制台(来自mingw项目)中转换Windows的命令解释器,必须使用命令“C:\ Windows \ System32 \ cmd.exe / C start C:\ mingw \”调用Runtime类的exec方法msys \ 1.0 \ bin \ bash.exe“(我使用外部命令而不是内部命令,因为它更有意义但你可以使用内部命令,如DIR等)。