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腳本已經開始執行了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM