アプリ固有の内部ストレージにファイルを保存する方法について見てみましょう。
2024.1.1
アプリ固有の内部ストレージ領域
ストレージには内部ストレージ(Internal Storage)と外部ストレージ(External Storage)があります。アプリには固有のストレージ領域があり、ここに起動時に必要な設定データなどを保存させることができます。
- 内部ストレージ:
- 常に使用できる
- ここに保存されたファイルは、自分のアプリからのみアクセスできる
- アプリがアンインストールされると削除される
- ユーザーからも他のアプリからも、自分のファイルにアクセスできないようにしたい場合に適する
- アクセスPermissionは不要
- ストレージ領域は限られているので大きなファイルは保存できない
- アプリ固有の外部ストレージ:
アプリがアンインストールされても残った方がいい場合などでは、共有のメディアや他の外部ストレージに保存することも可能です。
getFilesDir()
を使ってアプリ固有の内部ストレージにアクセスできます。
getFilesDir()はパスを返します。
/data/data/[package_name]/files/
adb shell コマンドではセキュリティーでブロックされて見えませんが、run-as を使えばデバック状態であれば見ることはできます。
サンプルコード
下の例は、 EditText で入力した文字列をTestFile.txt というファイルに入れて保存し、そのファイルから読み出す例です。
MainActivity.java
activity_main.xml
リソースファイル
strings.xml
一連の動作を確認してみます。
実際に保存したファイルを確認するときは
Device Explorer
を使うと確認できます。昔はADMともDevice File Explorerとも呼ばれていました、もっと昔にはDDMSと呼ばれていましたね…
Android Device Monitor, DDMS で確認
注)あくまでデバッグ段階でのファイル確認です
Android Studio にデフォルトで見えない場合は
「View」「Tool Windows」「Device Explorer」を選択
/data/data/[package_name]/files/以下に TestFile.txt を作るようにコーディングしましたが、クリックすると中身も見えて保存した内容が確認できました。
実機では
run-as [package name] をコマンドで打ち込んで確認できます
adb, run-as でローカルストレージ内をのぞく
openfileOutput , openFileInput
File API の代わりに、openFileOutput() を呼び出して、filesDir ディレクトリ内のファイルへの書き込みを行う FileOutputStream を取得することもできます。
ストリームを使用してファイルを保存する
第一引数はファイル名のみの指定です。
第二引数のモードは
- MODE_APPEND
- 追加で書き込み
- MODE_PRIVATE
- このアプリのみアクセス許可
書き込みは write()メソッドを使います。
strは書き込む文字列です。
読み出しでは
FileInputStream のインスタンスを openFileInput()メソッドで取得します。
InputStreamReaderでバイトを読み込み、指定された文字にデコードし、それをBufferedReaderに入れて、行毎に読み出します。変換効率を上げるため、BufferedReaderの内部にInputStreamReaderをラップするのがいいようです。
サンプルコード2
同様にEditTextから取得した文字列をファイルに入れて保存、読み出しをやってみます。
MainActivity.java
レイアウトなどの他のリソースは前のサンプルコードと同じです。
関連記事:
References:
ストレージ オプション | Android Developers
ファイルを保存する | Android Developers
Context#getFilesDir()
Context | Android Developers
View On-Device Files with Device File Explorer | Android Studio