【Androidアプリ入門】内部ストレージに保存・読込する♪ハマった編

今回は、[前回のAndroidアプリ](https://qiita.com/MuAuan/items/47d7b3dbafcc88eb235a)で内部ストレージに保存・読込を追加した。
情報は、ググるとそれなりに出てくるが結構ハマって、しかも日本語の読込は失敗しているが、現状進捗がなさそうなので、ここでまとめておこうと思う。

| 英語保存|英語読込|日本語保存|日本語読込|
|:-:|:-:|:-:|:-:|
|![eigo.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/8fb815d8-4615-56e2-8de5-506a81858a14.jpeg)|![eigo_output.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/e9417090-5007-526a-9845-3e9b67e21f32.jpeg)|![nihongo.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/c2c80457-42b2-2fb3-dcc9-54be55fa7f03.jpeg)|![nihongo_bake.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/ac7a2823-3eb2-3d9e-29c4-a4638b04af77.jpeg)|
###内部ストレージへの保存
これは、以下の参考のまま動きました。
ここでは、入力された文字列をinputStrに取得しているので、それを書き込むこととした。
また、File名は"testfile.txt"とした。
【参考】
[Android Internal Storage Example Tutorial](https://www.journaldev.com/9383/android-internal-storage-example-tutorial)

```MainActivity.kt
when(view.id) {
                //表示ボタンの場合…
                R.id.btClick -> {
                    //入力された名前文字列を取得。
                    val inputStr = input.text.toString()
                    //メッセージを表示。
                    output.text = df.format(date) + "\n"+inputStr + "さん、こんにちは!"  //inputStr + "さん、こんにちは!"
                    val fOut = openFileOutput("testfile.txt", Context.MODE_PRIVATE)
                    fOut.write(inputStr.toByteArray())
                    fOut.close()
                }
                //クリアボタンの場合…
                R.id.btClear -> {...
```
実際に書き込まれているかどうかを確認するために参考のような手順で確認してみた。
【参考】
[[Android] アプリの内部メモリを覗くとパーミッションでブロックされる](https://akira-watson.com/android/adb_run-as.html)

```
C:\Users\MuAuan\AndroidStudioProjects\HelloSample_qiita>bash
ubuntu@MyComputer:/mnt/c/Users/MuAuan/AndroidStudioProjects/HelloSample_qiita$ adb run-as
プログラム 'adb' は以下のパッケージで見つかりました:
 * adb
 * android-tools-adb
次の操作を試してください: sudo apt install <選択したパッケージ>
ubuntu@MyComputer:/mnt/c/Users/MuAuan/AndroidStudioProjects/HelloSample_qiita$ sudo apt install adb
ubuntu@MyComputer:/mnt/c/Users/MuAuan/AndroidStudioProjects/HelloSample_qiita$ adb shell
generic_x86:/ $
1|generic_x86:/ $ run-as com.example.hellosample

generic_x86:/data/data/com.example.hellosample $ ls
cache code_cache files
generic_x86:/data/data/com.example.hellosample $ cd files
generic_x86:/data/data/com.example.hellosample/files $ ls
file\ name testfile.txt

generic_x86:/data/data/com.example.hellosample/files $ ls -l
total 12
-rw-rw---- 1 u0_a137 u0_a137 0 2019-11-26 12:11 file\ name
-rw-rw---- 1 u0_a137 u0_a137 4 2019-11-26 14:17 testfile.txt
```
ということで、以下のようにtestfile.txtにfshkが書き込まれていることが分かります。

```
generic_x86:/data/data/com.example.hellosample/files $ cat testfile.txt
fshkgeneric_x86:/data/data/com.example.hellosample/files $
```
###読み込み
書き込んだファイルから、以下のコードで読み込みも出来ました。
ただし、英語のみ正しく読み込めました。
つまり、上記のように日本語もタイ語も文字化けしてしまいました。

```MainActivity.kt
R.id.btClick1 -> {
                    val fin: FileInputStream = openFileInput("testfile.txt")
                    var c=0
                    var temp=""
                    while (fin.read().also({ c = it }) != -1) {
                        temp = temp + Character.toString(c.toChar())
                    }
                    fin.close()
                    output.text = df.format(date) + "\n"  + temp
                    input.setText("")
                }
```
そして、日本語やタイ語がファイルにどう書き込まれているかを上記の方法でも可能ですが、今回は以下の方法で調べました。
【参考】
[Android Studioでファイル一覧を確認したい！](https://www.kunimiyasoft.com/devicefileexplorer/)
この方法で、スマホ実機の内部ストレージが覗けます。
さらに、そこにあるファイルをコピペすると見事に安全な？Dirにダウンロードして以下の図のようにtestfile.txtに書き込まれている内容が見えました。
![deviceFileExplorer.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/e20eafd8-22b1-cd9f-a643-0957a5eb7a43.jpeg)
###まとめ
・前回のAndroidアプリで入力データを内部ストレージに保存・読込してみた
・スマホ実機の内部ストレージを覗けるようになった

・日本語は文字化けしてうまく出来ていない
###おまけ
日本語文字化け解消のために以下を実施したがうまくいっていない
【参考】
[Kotlin で手軽にテキストファイルを読み込む](https://qiita.com/niwasawa/items/52a70119adb739236681)
試したコードは以下のとおり
このコードで一応実行は出来るが、読み込みを実施すると、アプリが中断してしまう。
これは、上記のコードでもファイル名が異なったりすると出る事象なので、やはりtemp = File(pathUtf8).readText(Charsets.UTF_8)で起きているようだ。
この部分をコメントアウトすると、読み込みはできないが、中断は起こさない。

```MainActivity.kt
               R.id.btClick1 -> {
                    var temp=""
                    var pathUtf8="testfile.txt"
                    temp = File(pathUtf8).readText(Charsets.UTF_8)
                    output.text = df.format(date) + "\n"  + temp
                    input.setText("")
                }
```