Android(kotlin) テキストファイルを読み込む
編集・作成するファイル
- words.csv (読み込むファイル)
- WordFromText.kt (読み込んだデータを格納するエンティティクラス)
- WordManager.kt (ファイル読み込み用クラス)
- MainActivity.kt (WordManager を呼び出す)
words.csv 読み込むファイルを用意する
以下のようなテキストファイルを用意します。
英単語とその日本語訳が書かれています。
英単語と日本語訳はタブ(TAB)で区切られているとします。
abstracted 抽出された / ぼんやりした counterfoil 小切手(為替の)控え northbound 北方行きの
用意したファイルは assets ディレクトリに配置しておきます。
WordFromText.kt (読み込んだデータを格納するエンティティクラス) を作成する
2つしか変数がないので、エンティティクラスで扱うまでもないかもしれませんが、個人的に単なる文字列で扱うよりも好みなので作成しています。
class WordFromText( val english: String, val japanese: String ) { }
WordManager.kt (ファイル読み込み用クラス) を作成する
class WordManager(context: Context) { private val myContext = context private var wordList: MutableList<WordFromText> = mutableListOf() fun getWordsFromText(): List<WordFromText> { Log.d("MyLog at WordManager", "Called getWordsFromText()") // Read text file & create objects myContext.assets.open("words.csv").reader(charset = Charsets.UTF_8).useLines {lines -> lines.forEach { val parts = it.split("\t") wordList.add(WordFromText(parts[0], parts[1])) }} return wordList } }
- assets ディレクトリ内のファイルにアクセスするため、コンテキストを受け取るようにしています。コンテキストがあれば、myContext.assets.open("ファイル名") で assets ディレクトリ内のファイルにアクセスが可能です。
- getWordsFromText() は下のような流れになっています。
1. ファイルを1行ずつ読み取る。
2. タブ(TAB) で分離
3. 読み取った行ごとに WordFromText オブジェクトを作り、それをリスト(wordList)に格納
4. 1 - 3 の繰り返し
5. 全ての行を読み取ったら、リスト(wordList)を返す
MainActivity.kt から WordManager を呼び出す
override fun onCreate(savedInstanceState: Bundle?) { (省略) val wm = WordManager(this@MainActivity) val words = wm.getWordsFromText()[f:id:blueskyarea:20200507190722p:plain] words.forEach { Log.d("MyLog at MainActivity", "Got English : ${it.english}, Japanese : ${it.japanese}") } (省略) }
- テスト用なので、onCreate() に書いていますが、ボタンクリックなどのイベントをベースに呼び出されるメソッドに書いたりもすると思われます。
- this だけでもコンテキストを渡せますが、this@MainActivity と書くことで、どの Activity クラスのコンテキストであるかが明示されます。
- きちんと読み取られているかを1行ずつ出力してチェックします。
ビルド・実行
Run ボタンをクリックして、ビルド・実行させます。
Logcat で以下のようなメッセージが取得されれば、きちんと読み取られていると確認できます。