JAVA調用Shell腳本

在實際項目中,Java有時候須要調用C寫出來的東西,除了JNI之外,我認爲一種比較好的方法是JAVA調用Shell。先把C寫出來的make成可執行文件,而後再寫一個shell腳本執行該可執行文件,最後是JAVA調用該shell腳本。java

JAVA調用很簡單,例子以下:web

首先是shell腳本shell

 

[plain]  view plain copy
 print?
  1. #!/bin/sh  
  2. echo Begin word cluster  
  3. /home/felven/word2vec/word2vec -train /home/felven/word2vec/resultbig.txt -output /home/felven/word2vec/classes.csv -cbow 0 -size 200 -window 5 -negative 0 -hs 1 -sample 1e-3 -threads 12 -classes 2000  
  4. echo The word classes were saved to file classes.csv  


而後是JAVA調用代碼app

 

 

[java]  view plain copy
 print?
  1. import java.io.BufferedReader;  
  2. import java.io.InputStreamReader;  
  3.   
  4. public class RunShell {  
  5.     public static void main(String[] args){  
  6.         try {  
  7.             String shpath="/home/felven/word2vec/demo-classes.sh";  
  8.             Process ps = Runtime.getRuntime().exec(shpath);  
  9.             ps.waitFor();  
  10.   
  11.             BufferedReader br = new BufferedReader(new InputStreamReader(ps.getInputStream()));  
  12.             StringBuffer sb = new StringBuffer();  
  13.             String line;  
  14.             while ((line = br.readLine()) != null) {  
  15.                 sb.append(line).append("\n");  
  16.             }  
  17.             String result = sb.toString();  
  18.             System.out.println(result);  
  19.             }   
  20.         catch (Exception e) {  
  21.             e.printStackTrace();  
  22.             }  
  23.     }  
  24. }  


其實就是一個Process類進行調用,而後把shell的執行結果輸出到控制檯下。eclipse

 

須要注意的是,在調用時須要執行waitFor()函數,由於shell進程是JAVA進程的子進程,JAVA做爲父進程須要等待子進程執行完畢。函數

另外在eclipse控制檯輸出時並非邊執行邊輸出,而是shell所有執行完畢後輸出,因此若是執行較爲複雜的shell腳本看到沒有輸出時可能會誤覺得沒有執行,這個時候看看終端裏面的進程,TOP命令一下就能看到其實shell腳本已經開始執行了。this

相關文章
相關標籤/搜索