2010-02-04 14 views
7

Estoy tratando de leer los resultados de un comando cmd (dir por ejemplo). Después de crear el proceso, utilizo un BufferedReader junto con un InputStreamReader. Por algún motivo, el BufferedReader sigue apareciendo vacío, aunque sé que debe haber algún resultado para leer.Problema con la salida de un comando cmd en java

Aquí está el código que estoy usando:

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

es process.getErrorStream() también volviendo vacío? –

+0

sí - tanto el ErrorStream como el InputStream tienen 0 bytes disponibles – chama

+0

Lo volví a ejecutar y la secuencia de error no está vacía. Cuando leí la secuencia de error, se imprimió "El sistema no puede encontrar la ruta especificada", lo cual no tiene sentido, pero al menos es algo. – chama

Respuesta

5

Tienes:

String[] str = new String[] {"cmd.exe", "/c", 
      "cd", "c:\\", 
      "dir", "/b", "/s"    
    }; 

que no me parece correcto. No puede poner múltiples comandos en cmd.exe en una línea de comando. Eso es un archivo por lotes.

Intenta eliminar todo el disco o el directorio.

edición: en efecto:

C:\>cmd.exe /c cd c:\ dir 
The system cannot find the path specified. 
+0

¡Eso resolvió el problema! ¡Puse un "&" entre el comando cd y el comando dir y obtuve el resultado correcto! – chama

+2

@chama: ¿Qué hay de simplemente usar 'dir/b/s C: \'? Solo por diversión: intente ejecutar su código desde otra unidad, como 'D:'. Su comando 'cd' no haría nada allí. En general, usa lo que sea aplicable y no intentes complicar demasiado las cosas. Este es un ejemplo donde necesitas exactamente un comando que hará lo que quieras. Esa secuencia de dos no lo hará. – Joey

1

Podría haber un error. En este caso, deberá también atrapan getErrorStream()

+0

Intenté atrapar el ErrorStream y obtuve "El sistema no puede encontrar la ruta especificada". Pero, ¿cómo no puede encontrar c: \? – chama

1

El comando está ejecutando es cmd.exe /c cd c:\ dir /b /s. No creo que esté haciendo lo que esperas.


quiero decir que usted ha concatenado dos comandos en una sola línea y el shell de Windows probablemente no lo hace así. Pruebe algo como

String[] str = new String[] {"cmd.exe", "/c", 
      "cd", "c:\\", "&&", 
      "dir", "/b", "/s"    
    }; 

El && contará la shell para ejecutar cd c:\ y después de ejecutar dir /b /s si el primer comando se ejecutó correctamente.

+0

ese es un muy buen punto. Originalmente estaba buscando un determinado archivo en esa carpeta. Desafortunadamente, sacar el/s no resolvió el problema – chama

Cuestiones relacionadas