👨‍💼

【Koltinケーススタディ】ファイル表現の拡張子を取得したい

2022/01/06に公開

いろいろなケース

ファイルシステム上のリソースの場合

Path(java.nio.file)インターフェースで表現することが多いと思っています
kotlinからはkotlinの拡張関数であるPath関数でPathインターフェースの実装クラスを初期化できます。

println(Path("test.html").extension)
println(Path("/lab/pguma/test.html").extension)

Pathインターフェースを使う場合は上記のように拡張プロパティとして定義されたextensionを使うのが一番手っ取り早いかと思います。

ネットワーク上のリソースや生文字列の場合

ネットワーク上のリソースはURIクラスをで表現することが多いと思っています。
こちらは一度文字列に変換した上で扱うのが現段階では一番望ましいと思います。

文字列としてどう扱うか?ですが
前述のextentionプロパティの実装が以下のようになっています。

public val Path.extension: String
    get() = fileName?.toString()?.substringAfterLast('.', "") ?: ""

こちらをそのまま拝借させてもらってStringクラスに対する拡張関数として定義しておくと便利かと思います。

extention.file.kt
fun String?.getExtension() = this?.substringAfterLast(".") ?: ""
println(URI.create("http://lab.pguma/on_network.html").toString().getExtension())
println(URI.create("file://lab.pguma/on_local_network.html").toString().getExtension())
println("classpath:string.html".getExtension())
val nullString:String? = null
println(nullString.getExtension())

まとめ

やはり標準APIの実装から学ぶことは多いですね。
実装方法に悩んだ時やよりよい実装を模索したいときは標準APIで同じような機能を担っている実装を参照してみると多くのヒントを得られるとしみじみと感じます。

Discussion