2013-04-26 57 views
0

我嘗試在java中運行這個shell,但它永遠不會工作。Java不會執行cmd行嗎?

Process p = Runtime.getRuntime().exec(" cat *.java|sed '/import/d'|sed'/package/d'>>b.java "); 

當我改變像「ls」或「open foo.java」代碼將作品CMD的東西。

任何想法爲什麼?

+0

(1)究竟發生了什麼?你是否收到任何錯誤訊息? (2)你的命令是否直接從shell運行? – 2013-04-26 01:47:40

+0

當我手工輸入時,該命令完全可用!該錯誤表示文件dos不存在。 – user2322045 2013-04-26 01:58:49

+0

是否直接從shell或某個IDE運行Java程序? – 2013-04-26 02:03:32

回答

1

問題是文件通配符模式未被glob擴展。因此,該模式按照字面處理,並且找不到該文件。你需要一個外殼如bash來解釋這一點:

Process p = Runtime.getRuntime().exec(new String[] { 
        "bash", "-c", 
        "cat *.java|sed '/import/d'|sed'/package/d'>>b.java" }); 

確保檢查的getErrorStream內容。

另外:考慮使用更方便的ProcessBuilder,它使用可變參數數組來構建命令String

+0

非常感謝! – user2322045 2013-04-26 02:22:12

0

這裏有幾個問題。

  1. *.java的部分是,通常是由殼
  2. 組裝從過程到過程管道伸展的水珠也殼特徵
  3. 輸出重定向爲殼特徵

基本上,你真的需要調用一個shell來運行這種類型的管道。 exec方法運行具有參數的特定程序。你可以通過直接調用shell並將命令行作爲參數來獲得這個工作,但是我懷疑這也能起作用。

您可能必須通過枚舉目錄內容並單獨讀取每個文件來實現cat *.java部分。對sed命令中的每個命令打開單獨的Process實例,並使用Process實例的輸入和輸出流實現它們之間的管道。