[Android] アプリ内にファイルを保存する FileOutputStream, FileInputStream

ファイルをアプリのローカルストレージに保存したり読み出したい場合は、FileOutputStream、 FileInputStreamを使うと簡単です。
 
下の例は、 EditText で入力した文字列を testfile.txt というファイルに入れて保存し、そのファイルから読み出す例です。その後run-asを使ってアプリ内にあるファイルと文字列を確認しました。
 

Android Studio 3.0
Android 8.0

 



FileOutputStream , FileInputStream

 
ストレージ オプション | Android Developers に説明がありますが、ストレージには「内部」ストレージと「外部」ストレージがあります。ここではこの内部ストレージにデータを保存させることが目的です。

  • 内部ストレージ:
    • 常に使用できる
    • ここに保存されたファイルは、自分のアプリからのみアクセスできます。
    • ユーザーがアプリをアンインストールすると、システムは内部ストレージから当該アプリのファイルをすべて削除します。
    • ユーザーからも他のアプリからも、自分のファイルにアクセスできないようにしたい場合、内部ストレージが最適です
  • 外部ストレージ:
    • 誰でも読み取り可能なため、ここに保存されたファイルは自分のコントロールの及ばない所で読み取られる可能性があります

Ref:ファイルを保存する | Android Developers
 

FileOutputStream

 
ファイル保存では FileOutputStream のインスタンスを openFileOutput()メソッドで取得します。

第一引数はファイル名のみの指定です。
実際の保存場所は /data/data/package_name/files/ 以下にあります。adb shell コマンドではセキュリティーでブロックされて見えませんが、run-as を使えば見ることはできます

 
第二引数のモードは

  • MODE_APPEND
    • 追加で書き込み
  • MODE_PRIVATE
    • このアプリのみアクセス許可

MODE_WORLD_READABLE / MODE_WORLD_WRITABLE
というモードもありましたが
API level 17 で Deprecated (非推奨)となりました

書き込みは write()メソッドを使います
 

FileInputStream

 
読み出しでは
FileInputStream のインスタンスを openFileInput()メソッドで取得

 
読み出しは read() を使います
またtry〜catchをつかう場合にtry-with-resources 文を使いました。
 
MainActivity.java

 
レイアウト
activity_main.xml

 
リソースファイル
strings.xml

 

 
実際に保存したファイルを確認するときは
Android Studio 3.0から
Device File Explorer
を使うと確認できます。昔はADMと呼ばれていました、現在も選択項目にありますが機能していません。もっと昔にはDDMSと呼ばれていましたね…
Android Device Monitor, DDMS で確認

/data/data/[package_name]/files/以下に testfile.txt を作るようにコーディングしたつもりですが、ありました。クリックすると中身も見えて保存した内容が確認できました。


 
実機では
run-as [package name] をコマンドで打ち込んで確認できます
adb, run-as でローカルストレージ内をのぞく
 
関連記事:

References:
Context
View On-Device Files with Device File Explorer | Android Studio
ストレージ オプション | Android Developers
ファイルを保存する | Android Developers