CMD.exe de comandos en Java que no termina
Pregunta
Estoy tratando de utilizar cmd.exe para buscar un archivo en un directorio específico y luego mostrar la ruta en un programa Java y escribir en un archivo. El problema es que el proceso nunca termina.
Aquí está mi código:
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();
}
Solución
Otros consejos
Runtime.exec
no funciona de esa manera. No se puede pasar varios comandos por el estilo a cmd.exe.
Runtime.exec
le permite ejecutar un solo proceso con una lista de argumentos. No proporciona ninguna operación de "concha" (como 2>&1
por ejemplo). Debe hacer ese tipo de redirección de IO sí mismo utilizando los flujos de entrada / salida.
Es similar a llamar a la función main
de otro programa.
Usted podría intentar `Runtime.exec (nueva String [] { "cmd.exe", "/ c", "dir", "C: \\"});
Pero, siendo realistas, si quieres listados de archivos, es mucho mejor usar las instalaciones de la clase java.io.File
, que no dependen de las funciones específicas del sistema operativo.
¿Por qué no usar Java para hacer salto de directorio en lugar de llamar comando externo concha? Esto hace que su código no portátil!
Debe utilizar el comando de arranque, además del proceso de cmd.exe con el modificador / C o / k antes de la orden de arranque. Ejemplo: para convertir el intérprete de comandos de Windows en una consola bash (desde el prroject MinGW) se debe invocar el método exec de la clase en tiempo de ejecución con el comando "C: \ Windows \ System32 \ cmd.exe / C empiecen C: \ MinGW \ MSYS \ 1.0 \ bin \ bash.exe"(yo uso un comando externo en lugar de una interna porque es más significante pero se puede usar como comando interno DIR y así sucesivamente).