[Android]キャッシュファイルに読み書きを行う | 妄想プログラマのらくがき帳

2013年1月14日月曜日

[Android]キャッシュファイルに読み書きを行う

内部ストレージにはキャッシュファイル専用のディレクトリがあります。
このディレクトリの特徴として以下の3点が挙げられます。
  • アプリのprivate領域にある
  • 内部ストレージが不足状態になると、このフォルダ内のデータはシステムによって削除される可能性がある
  • キャッシュファイルはアプリのアンインストール時に削除される
2点目が大きな特徴です。この特徴があるため、ファイルが必要無くなったら削除を行い、1MB程度の使用量に抑えておく必要があります。

キャッシュディレクトリにファイルを作成し、データを保存する

キャッシュディレクトリにファイルを作成し、データを書き込むコードは以下のようになります。
FileOutputStream outputStream = null;
try {
    // キャッシュ領域にファイルを作成し、書き込む。
    File file = new File(getCacheDir(), "cache.txt");
    file.createNewFile();
    if (file.exists()) {
        outputStream = new FileOutputStream(file);

        outputStream.write("test".getBytes());
        // ちなみにDDMSで確認したところ、確認時の環境下では
        // "/data/data/[パッケージ名]/cache/cache.txt"
        // に書き込まれた。
    }
} catch (IOException e) {
    Log.e("MyApp", "exception", e);
}
finally {
    try {
        if(outputStream != null) { outputStream.close(); }
    }
    catch (IOException e){
        Log.e("MyApp", "exception", e);
    }
}

キャッシュディレクトリに保存したファイルからデータを読み込む

ファイルからデータを読み込むコードは以下のようになります。
FileInputStream inputStream = null;
byte[] buffer = new byte[256];
try {
    File file = new File(getCacheDir(), "cache.txt");
    if (file.exists()) {
        inputStream = new FileInputStream(file);
        inputStream.read(buffer);
        String data = new String(buffer, "UTF-8");
    }
}catch (IOException e) {
    Log.e("MyApp", "exception", e);
}finally {
    try {
        if(inputStream != null) { inputStream.close(); }
    } catch (IOException e) {
        Log.e("MyApp", "exception", e);
    }
}

キャッシュディレクトリに保存したファイルを削除する

ファイルの削除はFileオブジェクトのdelete()を使います。
File file = new File(getCacheDir(), "cache.txt");
file.delete();

※2015/7/5  五嶋さんのコメントを受け、書き込み、読み込みのコードにtry-catch文を追加しました。

4 件のコメント:

  1. Eclipseに上記のままコピペしたらエラーになりました...
    どのような状況で使えば良いのでしょうか?

    返信削除
    返信
    1. どのようなエラーが出ているか教えていただけますでしょうか?
      上記記事を作成したときの環境で確認しましたがエラーとなりませんでした。AndroidまたはJavaのバージョンが原因となっている可能性もありますし、エラーの内容を確認した後に改めて調査いたします。

      削除
  2. try-catch文があったほうが良いですね〜

    返信削除
    返信
    1. ご指摘ありがとうございます。
      記事作成時は例外処理が入るとわかりにくいかな~と思って省略した気がするんですが、
      try-catch文が入ったからといってわかりにくくなるものでもないですね(^^ゞ

      近いうちにtry-catch文入りのソースコードに修正しておきます。

      削除