読者です 読者をやめる 読者になる 読者になる

vaguely

和歌山に戻りました。ふらふらと色々なものに手を出す毎日。

Groovyでテキストファイル操作

はじめに

やりたいこと:

  • ローカルに置いてあるテキストファイルに、一定時間ごとに書き込む。
  • 「q」と入力したらストップ。

ちょっと上記のような処理が必要になったため、入門がてらGroovyで書いてみることにしました。

書き込みとタイマー

ベラっと書きたかったのでベタ打ちでパス指定したテキストファイルに、2種類の内容を交互に書きます。

class WriterTask extends TimerTask{
    def targetFile = new File("test.txt")
    boolean flag = false
    void run(){
        targetFile.text = (flag)? "Test1": "Test2"
        flag = !flag
    }
}
Timer timer = new Timer()
timer.schedule(new WriterTask(), 0, 5000)

あまりJavaと変わらない気がするのは気のせいです。
(そもそもTimerやTimerTaskは、Javaのものを利用しているので仕方ないところがあります)

以下のimport文が不要なのは、Groovyではデフォルトでインポートされているから、ということでよりコード量が抑えられていますね。

import java.util.Timer
import java.util.TimerTask

さて、動作自体はこれで問題ないのですが、一度スタートさせると止まらない、という問題点があります。
特にGroovyConsoleで動かすとInterruptボタンも押せず、タスクマネージャーで無理やり止めたりしていました。

これはこれで気になるのですが、ここでは標準入力を受け取って、「q」が入力されたらストップさせる、ということにします。

入力を受けつける

ターミナルなどからの入力を受け付ける場合は、BufferedReader使うのが良さそうです。

class WriterTask extends TimerTask{
    def targetFile = new File("C:\\Users\\masanori\\test.txt")
    boolean flag = false
    void run(){
        targetFile.text = (flag)? "Test1": "Test2"
        flag = !flag
    }
}
def getInput(){
    def reader = new BufferedReader(new InputStreamReader(System.in))
    reader.lines().any{ line ->
        if(line == "q") {
            System.exit(1)
        } else {
            return true
        }
    }
}
Timer timer = new Timer();
timer.schedule(new WriterTask(), 0, 5000)
getInput()

おわりに

Twitterで話題になっていたこともあり挑戦したGroovyですが、今回のようにサッと書いて動かしたい、という場合に便利そうです。
(規模が大きくなる場合は、慣れの問題もあるとは思いますが、静的に型を持っている言語の方が今のところは良いかな、と思っています)

お手軽度で言えばGroovyConsoleで書いて実行、というのが良さそうですが、IntelliJの入力補完も便利で、慣れや処理の規模に合わせて選択するのも良さそうです。

あと個人的にGroovyに触れる機会が多いと思っているGradleについてももう少し調べてみたいところ。

ということで、のんびりペースにはなると思いますが、あれこれ試していきたいと思います。

参考