2017/10/06

[Kotlin de Android] 第9回 ファイルの読み書きをしてみよう

スポンサーリンク

さて、引き続きデータの永続化について見ていきたいと思います。
今回はファイルを使った方法です。

Javaっぽい書き方とKotlinっぽい書き方を紹介してみたいと思います。
今回もプロジェクトは作らずにソースコードの紹介のみです。

もくじ

FileOutputStreamを使ってファイルに書き込もう
FileInputStreamを使ってファイルを読み込もう
Kotlin標準ライブラリを使ってファイルに書き込もう
Kotlin標準ライブラリを使ってファイルを読み込もう

FileOutputStreamを使ってファイルに書き込もう

まずは書き込みからやってみたいと思います。

Javaでファイル書き込みと言えばFileOutputStreamを使うのが定番で、Androidアプリに置いても使われているようです。
なのでまずはこちらのやり方から見ていきましょう。

ざっと書くと以下のようになります。

ContextクラスのメソッドであるopenFileOutput()を使ってFileOutputStreamを生成します。
Androidアプリではファイルの保存場所が決められているのですが、openFileOutput()を使うと保存場所を意識せずにファイルを作ることができます。
第一引数はファイル名、第二引数はモードを指定します。基本的にはContext.MODE_PRIVATEを使えばOKです。MODE_PRIVATE以外の定数も以前はありましたが、現在は非推奨になっているので、必ずMODE_PRIVATEを選択するようにしましょう。

あとは普通のFileOutputStreamと同じように使ってあげればOKです。

FileInputStreamを使ってファイルを読み込もう

ファイルの読み込みはFileInputStreamを使います。
ざっと書くと次のようになります。

ContextクラスのメソッドであるopenFileInput()を使ってFileInputStreamを生成します。
FileOutputStreamのときと同じように、openFileInput()を使うとファイルの保存場所を意識せずにファイルにアクセスできるようになります。
引数はファイル名です。

今回の例では一行ずつ取得しているので、BufferedReaderを使ってあげます。
val reader = inputStream.bufferedReader()のところで、BufferedReaderを生成しています。

その次のfor文ですが、Javaではよく次のように書かれます。

Kotlinはwhileの条件式の中に代入文を入れることができないのと、for eachの書き方が用意されているのでforを使って書いてあげます。

reader.readLines()で1行読み込んで、lineBufferに代入しています。
lineBufferはここではLogに出力しているだけですが、StringBufferに入れたりだとか用途に応じて使ってあげてください。

最後に一応BufferedReaderをクローズしてあげて終了です。
BufferedReaderを閉じてあげれば、FileInputStreamも閉じてくれるようです。

スポンサーリンク

Kotlin標準ライブラリを使ってファイルに書き込もう

次にKotlinの標準ライブラリを使った方法を見ていきたいと思います。

ひとまずソースを。

まずファイル名ですが、今回はファイルの保存場所を意識する必要があります。
といっても難しいことはなくて、保存場所はContextクラスのfilesDirプロパティで取得することができます。
なので、"$filesDir/hello.txt" というようにしてあげればOKです。

ファイルの操作を行うにはFileクラスを使ってあげます。File(fileName)というようにオブジェクトを作ってあげます。
あとは簡単で、writeTextメソッドを使えばさくっと書き込んでくれます。

FileOutputStreamを使うよりもスッキリかけていいですね。

Kotlin標準ライブラリを使ってファイルを読み込もう

では最後にKotlinの標準ライブラリを使ってファイルの読み込みのする方法をいきましょう。

まずソースを。

Fileの生成までは書き込みのときと同じです。

ファイルの中身を読み込むときですが、1行ずつの場合はforEachLineを使えばOKです。
イテレーターなのでちょっと特殊な書き方に思えますが、最後の行までループしてくれると思っておけばよいかと思います。
for文と違って、受け取る変数がないのですが、itというイテレーター専用の変数(ちょっと違うかも?)があるのでそれを使うと1行ずつのデータを受け取ることができます。
ここではitをログに出力しているだけですが、itをStringBufferに保存するなど用途に応じて使ってあげてください。

ファイルの読み込みもこちらのほうがFileInputStreamを使うよりもすっきりかけますね。

ソース量はKotlinの標準ライブラリを使ったほうが少なくなりますが、ファイルの場所をきちんと指定する必要があるなどのデメリットもあるので、どちらがいいのかは結局わかりません…。
どちらの書き方も知っておくと便利かなぁとは思います。

スポンサーリンク