JAVA呼び出しシェルスクリプト


実際のプロジェクトでは、JAVAは時々Cで書いたものを呼び出す必要があります。JNI以外に、JAVAでShellを呼び出すのがいいと思います。まずCで書いたmakeを実行ファイルにして、shellスクリプトを書いて実行ファイルを実行します。最後にJAVAでshellスクリプトを呼び出します。
JAVAの呼び出しは簡単です。例は以下の通りです。
まずshellスクリプトです。
#!/bin/sh
echo Begin word cluster
/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
echo The word classes were saved to file classes.csv
そしてJAVAコールコードです。
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class RunShell {
	public static void main(String[] args){
		try {
			String shpath="/home/felven/word2vec/demo-classes.sh";
		    Process ps = Runtime.getRuntime().exec(shpath);
		    ps.waitFor();

			BufferedReader br = new BufferedReader(new InputStreamReader(ps.getInputStream()));
			StringBuffer sb = new StringBuffer();
			String line;
			while ((line = br.readLine()) != null) {
				sb.append(line).append("
"); } String result = sb.toString(); System.out.println(result); } catch (Exception e) { e.printStackTrace(); } } }
つまりProcessクラスを呼び出して、shellの実行結果をコンソールの下に出力します。
注意したいのは、呼び出し時にwaitFor関数を実行する必要があります。shellプロセスはJAVAプロセスのサブプロセスです。JAVAは親プロセスとして、子プロセスの実行が完了するまで待つ必要があります。
また、eclipseコンソールの出力は実行しながら出力するのではなく、shellが全部実行して出力するので、より複雑なshellスクリプトを実行すると、出力がないと誤って実行していないということがあります。この時は端末内のプロセスを見てください。