我嘗試在java中運行這個shell,但它永遠不會工作。Java不會執行cmd行嗎?
Process p = Runtime.getRuntime().exec(" cat *.java|sed '/import/d'|sed'/package/d'>>b.java ");
當我改變像「ls
」或「open foo.java
」代碼將作品CMD的東西。
任何想法爲什麼?
我嘗試在java中運行這個shell,但它永遠不會工作。Java不會執行cmd行嗎?
Process p = Runtime.getRuntime().exec(" cat *.java|sed '/import/d'|sed'/package/d'>>b.java ");
當我改變像「ls
」或「open foo.java
」代碼將作品CMD的東西。
任何想法爲什麼?
問題是文件通配符模式未被glob擴展。因此,該模式按照字面處理,並且找不到該文件。你需要一個外殼如bash
來解釋這一點:
Process p = Runtime.getRuntime().exec(new String[] {
"bash", "-c",
"cat *.java|sed '/import/d'|sed'/package/d'>>b.java" });
確保檢查的getErrorStream內容。
另外:考慮使用更方便的ProcessBuilder,它使用可變參數數組來構建命令String
。
非常感謝! – user2322045 2013-04-26 02:22:12
這裏有幾個問題。
*.java
的部分是,通常是由殼基本上,你真的需要調用一個shell來運行這種類型的管道。 exec
方法運行具有參數的特定程序。你可以通過直接調用shell並將命令行作爲參數來獲得這個工作,但是我懷疑這也能起作用。
您可能必須通過枚舉目錄內容並單獨讀取每個文件來實現cat *.java
部分。對sed
命令中的每個命令打開單獨的Process
實例,並使用Process
實例的輸入和輸出流實現它們之間的管道。
(1)究竟發生了什麼?你是否收到任何錯誤訊息? (2)你的命令是否直接從shell運行? – 2013-04-26 01:47:40
當我手工輸入時,該命令完全可用!該錯誤表示文件dos不存在。 – user2322045 2013-04-26 01:58:49
是否直接從shell或某個IDE運行Java程序? – 2013-04-26 02:03:32