2010-02-04 12 views
7

Sto cercando di leggere i risultati di un comando cmd (dir per esempio). Dopo aver creato il processo, utilizzo uno BufferedReader insieme a uno InputStreamReader. Per qualche motivo, lo BufferedReader continua a venire vuoto, anche se so che ci deve essere un output da leggere.Problema con l'output di un comando cmd in java

Ecco il codice che sto utilizzando:

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

process.getErrorStream() restituisce anche vuoto? –

+0

sì - sia ErrorStream che InputStream hanno 0 byte disponibili – chama

+0

Ho appena eseguito di nuovo e il flusso di errori non è vuoto. Quando ho letto il flusso di errori, è stato stampato "Il sistema non riesce a trovare il percorso specificato", il che non ha esattamente senso, ma almeno è qualcosa. – chama

risposta

5

Hai:

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

che non mi sembra giusto. Non è possibile inserire più comandi su cmd.exe su una riga di comando. Questo è un file batch.

Provare a eliminare tutto il cd o la dir.

edit: infatti:

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

Questo ha risolto il problema! Ho messo un "&" tra il comando cd e il comando dir e ho ottenuto l'output corretto! – chama

+2

@chama: che dire semplicemente usando 'dir/b/s C: \'? Solo per il gusto di farlo: prova a eseguire il codice da un'altra unità, come 'D:'. Il tuo comando 'cd' non farebbe nulla lì. In generale, utilizza qualsiasi cosa sia applicabile e non cercare di complicare eccessivamente le cose. Questo è un esempio in cui hai bisogno esattamente di un comando che farà ciò che vuoi. Questa sequenza di due non lo farà. – Joey

1

Ci potrebbe essere un errore. In questo caso si dovrebbe anche trappola getErrorStream()

+0

Ho provato a intercettare l'ErrorStream e ho ottenuto "Il sistema non riesce a trovare il percorso specificato". Ma come può non trovare c: \? – chama

1

Il comando è in esecuzione è cmd.exe /c cd c:\ dir /b /s. Non penso che stia facendo quello che ti aspetti.


voglio dire che avete concatenato due comandi in una linea e la shell di Windows, probabilmente non lo fa così. Provare qualcosa di simile

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

Il && dirà la shell per eseguire cd c:\ e poi eseguire dir /b /s se il primo comando ha avuto successo.

+0

questo è un ottimo punto. Inizialmente cercavo un determinato file in quella cartella. Sfortunatamente, togliere il/i non ha risolto il problema – chama