Sun, November 22, 2009
groovyのIO処理が簡潔すぎる話、OSコマンドの実行の場合
ちょっとした作業スクリプトを書くときは、なるべくJythonで、無理な場合は一部Javaで記述、 というようにしてきたのだが、最近これをやめて groovy に全面移行しようとしている。
移行当初はJythonの方が楽な部分もあるかな、と思っていたが、 すべてにおいてgroovyの方が楽に書けるのがすごい。 といっても元がJavaプログラマなので、その辺は割り引いて。 (Pythonな人なら結論は違うだろうけど、でもPythonプログラマならわざわざJythonを使うことはないか。)
今回は diff で2つのファイルを比較して内容が同じでなければ○○する、 という実装をしようと思って、groovyでOSコマンド実行コードを書いたのだが、 簡潔すぎるのでびっくりしたのでメモ。
diff で二つのテキストファイルを比較して結果を標準出力
まずJavaの場合
import java.io.*;
public class Test{
public static void main(String[] a) throws IOException {
String cmd="diff test1.txt test2.txt";
Process process = Runtime.getRuntime().exec(cmd);
InputStream is = process.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is,"UTF-8"));
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
br.close();
}
}
groovyの場合
cmd = 'diff test1.txt test2.txt'
def p = Runtime.getRuntime().exec( cmd )
def r = p.getInputStream().newReader('UTF-8')
r.eachLine{ println it }
r.close()
Java vs groovy
この場合、Javaは15行、groovyは 5行で済む。
groovyが
単に短く書けるというだけでなく、
ダイレクトに処理させようとしていることを表現できているところがすごい。
二つのファイルで差があればNG、なければOKを表示
ちなみに、 比較したテキストファイルに差があるかないかで処理をわけるには、 たとえば以下のような方法で判定する。
def cmd = 'diff test1.txt test2.txt'
def p = Runtime.getRuntime().exec( cmd )
def r = p.getInputStream().newReader('UTF-8')
def list = []
r.eachLine{ list.add( it ) }
r.close()
if( list.size()==0 )
println 'OK'
else
println 'NG'