2013年12月13日 星期五

Java call command

這個其實也沒有太特別~ 算是Java的基本功能吧O_o...
只不過因為這次的整合, 屬於AP的方式...
所以就靠主流程一直下cmd來進行處理~~

主要就是使用Runtime來處理~
因為有些AP是直接將結果或exception, 直接output到console上, 所以就要好好的讀一下它output的內容~

只是單純的想使用簡潔的Runtim process會出現他沒辦法change 工作路徑過去~
這時候使用ProcessBuilder會比較好...
ProcessBuilder builder = new ProcessBuilder(cmd);
builder.directory(new File(home));

另外Process的waitfor()的使用上會卡住的原因, 好像前提是要把Process相關的inputStream(InputStream, ErrorStream)讀完後, 跟outputStream都關掉後~再執行, 就不會有問題...
不過我也只是要讀讀console上的東西~ 就算了XD...
因為當初就跟其他的lib講好~ 把結果output在console或是console+file裡...統一方式比較好處理...

實作上我也不想真的在java裡面寫很多次的cmd呼叫 , 所以主要是~ 先用java寫出動態的sh/bat檔...裡面依據需要給參數或是好幾行的依序執行內容~ 檔寫好後再去執行一次那個檔就好了...寫檔有個好處啦~ debug或只是測試lib, 重新操作比較方便~

public String runCmd(String home, String cmd) throws Exception {
       Process p = Runtime.getRuntime().exec(cmd, null, new File(home));
       InputStream is = p.getInputStream();

       StringBuffer sb = new StringBuffer();
       BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
       while (true) {
           String tmp = reader.readLine();
           if(tmp == null)  {
               break;
           }
           if(tmp != null)  {
               sb.append(tmp+"\n");
           }
       }
     
       return sb.toString();
   }

後來又有在某地方改一個應該是比較正統的寫法~加上p.waitfor()
public String runCmd(String home, String cmd) throws Exception {
       Process p = Runtime.getRuntime().exec(cmd, null, new File(home));
       InputStream is = p.getInputStream();

       BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
       while (reader.ready()) {
           ;
       }
       reader.close();

       reader = new BufferedReader(new InputStreamReader(p.getErrorStream()));
       while (reader.ready()) {
           ;
       }
       reader.close();

       p.getOutputStream().close();
       p.waitFor();

       return "";
   }

沒有留言: