2010-02-04 11 views
7

我正在嘗試讀取cmd命令的結果(例如dir)。創建完成後,我使用BufferedReaderInputStreamReader。出於某種原因,BufferedReader一直空着,即使我知道必須讀取一些輸出。在java中輸出cmd命令的問題

這裏是我使用的代碼:

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()也返回空? – 2010-02-04 16:57:20

+0

是 - ErrorStream和InputStream都有0個字節可用 – chama 2010-02-04 17:01:22

+0

我只是再次運行它,並且錯誤流不是空的。當我讀取錯誤流時,它會打印出「系統找不到指定的路徑」,這不完全合理,但至少它是某種東西。 – chama 2010-02-04 17:05:58

回答

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. 
+0

解決了這個問題!我在cd命令和dir命令之間放了一個「&」,並得到了正確的輸出! – chama 2010-02-04 17:20:45

+2

@chama:簡單地使用'dir/b/s C:\'怎麼辦?只是爲了它的樂趣:嘗試從另一個驅動器運行你的代碼,例如'D:'。你的cd命令在那裏什麼都不會做。一般情況下,使用任何適用的方法,而不要嘗試過分複雜的東西。這是一個例子,你需要一個命令來完成你想要的任務。這兩個序列不會。 – Joey 2010-02-04 18:03:39

1

有可能是一個錯誤。在這種情況下,你也應該陷阱getErrorStream()

+0

我試圖捕獲ErrorStream並得到「系統找不到指定的路徑。」但它怎麼能找不到c:\? – chama 2010-02-04 17:12:16

1

您正在運行的命令是cmd.exe /c cd c:\ dir /b /s。我不認爲這是你所期望的。


我的意思是你已經串連兩個命令成一行和Windows外殼程序可能不會這樣。嘗試類似

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

&&會告訴執行cd c:\殼,然後執行dir /b /s如果第一個命令是成功的。

+0

這是一個很好的觀點。我最初正在搜索該文件夾中的某個文件。不幸的是,拿出/ s沒有解決問題 – chama 2010-02-04 17:18:49