この記事で分かること
- Kotlinで文字コード指定してファイルに出力する方法
- Kotlin 1.5で導入された比較的新しい書き方
- 文字化けを検知しながらファイルに書き込む方法
この記事では、Kotlinで文字コード(エンコーディング)を指定してファイルに書き込む方法について解説しています。
KotlinやJavaでファイルを操作する方法は本当に沢山あり、当サイトでも以下のようなファイル操作ライブラリの比較記事を投稿しています。
-
【オススメあり】Javaでファイル操作する方法の徹底比較 (JDK標準 / Apache Commons / Google Guava)
この記事では、Javaでファイルの読み出し/書き込みをする際に利用できるライブラリを紹介します。 Javaではファイル操作をする方法が複数あって、どれを使えば良いか迷いますよね?このページでは、JDK ...
続きを見る
今回の記事では、Kotlinでのみ使える比較的新しい手法(見た目がシンプルで理解しやすい)について紹介します。
書き込むデータ量が少ない場合には、今回紹介するようなシンプルなやり方でも問題ないと思います。
*データ量が多い場合は、分割して書き込むなどの工夫が必要になります
KotlinはJavaに比べて上手く抽象化されていて、シンプルで理解しやすいコードになりますね!
サンプルコード
単純な実装
Kotlinの内部文字コードであるUTF-16を、SJISに変換してファイル出力するサンプルです。
Stringを(SJISの)ByteArrayに変換し、writeBytesでバイナリデータをそのままファイルに出力します。
val path = Files.createFile(Path.of("/temp/output_path", "out.txt"))
path.writeBytes(str.toByteArray(Charset.forName("Shift_JIS")))
writeBytesメソッドは、Kotlin 1.5で導入されたPathの拡張関数です。(https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.io.path/java.nio.file.-path/write-bytes.html)
変換できない文字を除外する
CharsetEncoderを使ってファイル書き込み前に変換可能な文字かをチェックしています。
SJISに変換する際に文字化けする可能性がある場合に有効な方法になります。
val encoder: CharsetEncoder = Charset.forName("Shift_JIS").newEncoder()
if (encoder.canEncode(str)) {
val path = Files.createFile(Path.of("/temp/output_path", "out.txt"))
path.writeBytes(str.toByteArray(Charset.forName("Shift_JIS")))
}
SJISに文字コード変換出来ない文字は、いわゆるはしご高や絵文字などが当てはまります。
詳しい内容は以下の記事を参照してください。
-
UTF-8 / SJIS 文字コード変換できない文字を検知する [Java]
この記事では、UTF-8 から Shift-JIS に変換する際に文字化けが発生するかを判定するプログラムを紹介しています。また、文字化けを引き起こす代表的な文字のサンプルもいくつか提示しています。 ...
続きを見る
直接ファイルに出力する
テキストをバイナリデータに変換せずに直接ファイルに書き込むことも出来ます。
ファイルに出力する方法は他にも沢山あると思いますが、あまり大きなデータでなければこの様なシンプルな書き方でも問題ないと思います。
val path = Files.createFile(Path.of("/temp/output_path", "out.txt"))
path.writeText(str, Charset.forName("Shift_JIS"))
まとめ
最後に、この記事の内容をまとめます。
要点まとめ
- Pathの拡張関数を使うことでコードをシンプルにできる
- 文字コード変換する場合、ByteArrayに変換してからwriteBytesで書き込む
- 文字化けをチェックするには、CharsetEncoderを使用する
私は、本質的に重要でないコードをダラダラと長く書くのは好きではありません。
ファイル操作に関するコードなどは面倒なだけで、出来れば何も考えずに書ければ良いのにといつも思っています。
今回紹介したKotlinのファイル書き込みのコードがいつ如何なる時にも使えるとは思っていませんが、シンプルなので使える場面では積極的に使っていきたいと思います。
少しでも参考になりましたら幸いです!
この記事が良かったと思ったら、ぜひ他のKotlin関連の記事も読んでみて下さいね!