exec()を使わずに、Javaからmecabを呼べるのか

※前提
mecabを呼ぶ専用のライブラリは使わない。
JavaではなくGroovyを使う!!
環境はVirtualBoxで仮想化したUbuntu10.04、IDEはNetbeans6.8を使った。
Netbeansだと、数クリックでGroovyを有効にできるのでw)

Groovyのコード

import java.util.ArrayList;

/**
 *
 * @author Syu-syu
 */
public class mecab {
    public ArrayList<String> mecabStart(ArrayList<String> list){
        ArrayList <String> result = new ArrayList<String>();
        for(String s : list){
            result.add(this.getMorph(s));
        }      
        return result;
    } 
    
    public String getMorph(String str){
        def String sentence = str;
        sentence = sentence.replaceAll("\"","''");
        def String command = "/usr/bin/mecab";
        
        return new Pipe("echo ${sentence}").to(command).text();       
    }
}

def class Pipe {
    private Process p;

    def Pipe(cmd){
        p = cmd.execute();
        p.out.close();
    }

    def to(cmd){
        def p2 = cmd.execute();
        p2.out << p.in;
        p2.out.close();
        p=p2;
        this;
    }

    def text(){
        p.text;
    }
}

def to(cmd)や、def text()など、returnがないものがあります。
Groovyは最後の表記を勝手にreturnしてくれるので、書かなくてもよい。
書いた方がわかりやすいかも・・・

別のJavaプログラムから、文章のリストArrayListをmecabStartに投げる
mecabStartがgetMorphメソッドのreturnでPipeを動かして、投げられたリストの数分、形態素解析をしてくれます。

結果を受け取るJavaのプログラム

        mecab mecab_result = new mecab();
        ArrayList<String> morphlogical_result = mecab_result.mecabStart(inputdata);

Groovyのコードはstaticじゃないので、newしてあげる。
上記のコードでは、mecab_resultという変数をmecab型で宣言してます。
それで、mecab_result.mecabStart();が実行できる。
mecabStart(inputdata);のinputdataは入力された文章を1文ごとにリスト化したArrayListです。

結論

ライブラリなしでも、exec()使わずにJavaからmecabを呼べる!
※ただし、Groovyに限る。