[Android] アプリ固有の内部ストレージにファイルを保存する

internal storage 02 - [Android] アプリ固有の内部ストレージにファイルを保存する
アプリ固有の内部ストレージにファイルを保存する方法について見てみましょう。

Android Studio 4.1.2
API 30

 

R904D.P21641J - [Android] アプリ固有の内部ストレージにファイルを保存するimpression?a id=2545321&p id=969&pc id=1263&pl id=47128 - [Android] アプリ固有の内部ストレージにファイルを保存する

アプリ固有の内部ストレージ領域

 
ストレージには内部ストレージ(Internal Storage)と外部ストレージ(External Storage)があります。アプリには固有のストレージ領域があり、ここに起動時に必要な設定データなどを保存させることができます。

scoped storage 02 - [Android] アプリ固有の内部ストレージにファイルを保存する

  • 内部ストレージ:
    • 常に使用できる
    • ここに保存されたファイルは、自分のアプリからのみアクセスできる
    • アプリがアンインストールされると削除される
    • ユーザーからも他のアプリからも、自分のファイルにアクセスできないようにしたい場合に適する
    • アクセスPermissionは不要
    • ストレージ領域は限られているので大きなファイルは保存できない
  • アプリ固有の外部ストレージ

アプリがアンインストールされても残った方がいい場合などでは、共有のメディアや他の外部ストレージに保存することも可能です。
 

データを保存するストレージ領域が目的・用途によって区分されてセキュリティー的に厳しくなりました。対象範囲別外部ストレージ Scoped Storage と言われる「対象範囲別外部ストレージ」がAPI29で導入されました。API30では更に厳

 

 

getFilesDir()

 
Context#getFilesDir()を使ってアプリ固有の内部ストレージにアクセスできます。

getFilesDir()はパスを返します。
/data/data/[package_name]/files/

adb shell コマンドではセキュリティーでブロックされて見えませんが、run-as を使えばデバック状態であれば見ることはできます。

 

サンプルコード

 
下の例は、 EditText で入力した文字列をTestFile.txt というファイルに入れて保存し、そのファイルから読み出す例です。
 
MainActivity.java

レイアウト
activity_main.xml

 
リソースファイル
strings.xml

一連の動作を確認してみます。

 
実際に保存したファイルを確認するときは
Device File Explorer
を使うと確認できます。昔はADMと呼ばれていました、もっと昔にはDDMSと呼ばれていましたね…
Android Device Monitor, DDMS で確認

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

appinternalstorage 01 - [Android] アプリ固有の内部ストレージにファイルを保存する
 
実機では
run-as [package name] をコマンドで打ち込んで確認できます
adb, run-as でローカルストレージ内をのぞく

 

FileOutputStream, FileInputStream

 
File API の代わりに、openFileOutput() を呼び出して、filesDir ディレクトリ内のファイルへの書き込みを行う FileOutputStream を取得することもできます。
ストリームを使用してファイルを保存する
 

第一引数はファイル名のみの指定です。

 
第二引数のモードは

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

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

strは書き込む文字列です。
 
読み出しでは
FileInputStream のインスタンスを openFileInput()メソッドで取得します。

 
InputStreamReaderでバイトを読み込み、指定された文字にデコードし、それをBufferedReaderに入れて、行毎に読み出します。変換効率を上げるため、BufferedReaderの内部にInputStreamReaderをラップするのがいいようです。

 

サンプルコード2

 
同様にEditTextから取得した文字列をファイルに入れて保存、読み出しをやってみます。
 
MainActivity.java

 
レイアウトなどの他のリソースは前のサンプルコードと同じです。
 
 
関連記事:
 

asynctask 00b 100x100 - [Android] アプリ固有の内部ストレージにファイルを保存する
データを保存するストレージ領域が目的・用途によって区分されてセキュリティー的に厳しくなりました。 対象範囲別外部ストレージ   S...

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

アプリ開発が上達するお勧め

アプリ開発を始めたけどわからないところがあり、誰かに聞きたいけど周りにはそんな人はいない…あるいは、会社で働いていて日中そんなに時間をとれないなど、オンラインのプログラミングスクールがいいでしょう。

TECH ACADEMY
Androidアプリコース



Code Camp
現役エンジニアによるオンラインプログラミングスクール【CodeCamp】


直接(ネットで)誰か分かる人に聞いた方が早く解決して、上達も早いと思います。



侍エンジニア塾
侍エンジニア塾 無料体験レッスン


とても簡単なことなのに本やネットの画像だけでは分かりにくいことはあります。実際に質問してピンポイントで教えてもらうと、なんだそんなこと、と言うのがけっこうあります。


シェアする

  • このエントリーをはてなブックマークに追加

フォローする