Home About
Kotlin

Groovy でテキストファイルを読み書きするのと同じ方法を Kotlin Script でも使いたい

Groovy の場合は new File("foo.txt").text のようなお作法で気軽にテキストファイルを読み書きできる。 Kotlin Script でもこのように手軽にテキストファイルの読み書きができないか調べた。 拡張プロパティ Extension Properties という機能を使えば普通にできた。

環境:

$ kotlin -version
Kotlin version 1.9.22-release-704 (JRE 17.0.10+7-Ubuntu-122.04.1)

まず拡張プロパティを使わないでテキストを読み書きするのに次ようなコードを使っていることとする。

import java.io.File

object FileUtils {
    val writeText: (File, String)->Unit = {file, content->
        file.writeText(content, Charsets.UTF_8)
    }
    val readText: (File)->String = {file->
        file.readText(Charsets.UTF_8)
    }
}

ファイルにテキストを書く

拡張プロパティを使わないで FileUtils を使って次のように書く。

val file0 = File("hello.txt")
val text0 = "Hello, World!"
FileUtils.writeText(file0, text0)

実行して cat する。

$ kotlin main.kts
$ cat hello.txt
Hello, World!

できた。

ファイルからテキストを取得

拡張プロパティを使わないで FileUtils を使って次のように書く。

val file1 = File("hello.txt")
val text1 = FileUtils.readText(file1)
println( text1 )

実行。

$ kotlin main.kts
Hello, World!

できた。

Groovy のようにテキストを読み書きする

たとえば、テキスト読み出すコードを Groovy 風に書く。

val file2 = File("hello.txt")
println( file2.text )

このコードを実行すると unresolved reference: text と言われてもちろん作動しない。

そこで拡張プロパティを定義して対処する。

既存の java.io.File に対して text という拡張プロパティを定義する。

var File.text: String
     get() = FileUtils.readText(this)
     set(v) = FileUtils.writeText(this, v)

もうこれで java.io.File に対して text というテキストファイルを読み書きするプロパティを設定できています。

これで Groovy 風に記述できます。

File("hello.txt").text = "Hello, World!"
println( File("hello.txt").text )

まとめ

コード全体を掲載します。

main.kts

import java.io.File

object FileUtils {
    val writeText: (File, String)->Unit = {file, content->
        file.writeText(content, Charsets.UTF_8)
    }
    val readText: (File)->String = {file->
        file.readText(Charsets.UTF_8)
    }
}


/*
val file0 = File("hello.txt")
val text0 = "Hello, World!"
FileUtils.writeText(file0, text0)

val file1 = File("hello.txt")
val text1 = FileUtils.readText(file1)
println( text1 )
*/

var File.text: String
     get() = FileUtils.readText(this)
     set(v) = FileUtils.writeText(this, v)

File("hello.txt").text = "Hello, World!"
println( File("hello.txt").text )

以上です。

Liked some of this entry? Buy me a coffee, please.