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 風に書く。
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 )
以上です。