Java調用Shell腳本

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

JAVA調用很簡單,例子如下:

首先是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調用代碼

[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的執行結果輸出到控制檯下。

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

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

轉自:http://blog.csdn.net/zhaoxinfan/article/details/11891701



發佈了11 篇原創文章 · 獲贊 28 · 訪問量 22萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章