mucchinのAndroid戦記

Androidアプリのデータ保存方法の一つ「ローカルファイル」の使い方

Androidアプリのデータ保存方法の「ローカルファイル」の使い方は?

Androidアプリでは、いくつかのデータ保存方法が用意されていますが、その内の一つに「ローカルファイル」があります。

以前に、プリファレンスに関する記事を書きました。
Androidアプリのデータ保存方法の一つ「プリファレンス」の使い方

プリファレンスは使いやすいですが、何行にもまたがるテキストや画像のデータを保存する場合は、今回紹介するローカルファイルの方が使い勝手がいいと思います。


それでは、サンプルコードとともに、ローカルファイルの使い方をみていきましょう。

ローカルファイルの書込み方法

まずは保存時の処理の説明です。
EditTextに入力した文字列をテキストファイルとして保存する、という処理を例にします。


EditText et = (EditText)findViewById(R.id.edittext01);
String s = et.getText().toString();
try{
  OutputStream out = openFileOutput(“a.txt”,MODE_PRIVATE);
  PrintWriter writer =
     new PrintWriter(new OutputStreamWriter(out,”UTF-8″));
  writer.append(s);
  writer.close();
}catch(IOException e){
  e.printStackTrace();
}
EditTextから文字列を取り出すところは飛ばして、try句の中をみてみましょう。
まずは、出力用ストリーム(OutputStream)インスタンスを、openFileOutput()メソッドで取得します。
このとき第一引数で指定するファイル名は、パス無しでファイル名のみを指定します。
ファイルパスは、OSにより、Androidアプリ毎に一意に決められますので、アプリ側からパスを指定する事は出来ません。

第二引数は操作モードです。
以下の定数を指定します。
MODE_APPEND:既存ファイルを追記モードで開きます。
MODE_PRIVATE:ローカルファイルを作成したAndroidアプリのみにアクセス許可を与える場合に指定します。
MODE_WORLD_READABLE:他アプリから読み取り可能にします。
MODE_WORLD_WRITEABLE:他アプリから書込み可能にします。
複数指定したい場合は、上記定数を論理和で指定します。

そして、取得したOutputStreamインスタンスを使い、文字コードはUTF-8として、PrintWriterインスタンスを生成して、あとはPrintWriter.append()で書き込みたい文字列を渡して、close()で保存する、というだけです。

ローカルファイルの読込み方法

それでは、保存されているローカルファイルを読み込むときの方法をみてみましょう。
読み込んだ文字列をEditTextに表示する、という例です。


try{
  InputStream in = openFileInput(“a.txt”);
  BufferedReader reader =
     new BufferedReader(new InputStreamReader(in,”UTF-8″));
  String s;
  EditText et = (EditText)findViewById(R.id.edittext01);
  while((s = reader.readLine())!= null){
    et.append(s);
    et.append(“\n”);
  }
  reader.close();
}catch(IOException e){
  e.printStackTrace();
}
ローカルファイルの読込みは、openFileInput()メソッドを使います。
引数にファイル名のみを指定して、入力ストリーム(InputStream)インスタンスを取得します。
そのInputStreamを使って、BufferedReaderインスタンスを生成します。
そのBufferedReaderインスタンスのreadLine()メソッドを使って、1行ずつ読込んでいきます。
ローカルファイルの書込み、読込みは、入出力ストリームを取得した後の処理としては、基本的なJavaでのファイル入出力方法と全く同じです。
Androidに限った処理方法ではないので、Javaでのファイル入出力処理を書いた事があれば、簡単に理解できると思います。

ローカルファイルの削除方法

ローカルファイルの削除方法を説明します。


deleteFile(“a.txt”);
上記のように、deleteFile()メソッドを使用してファイル名を指定するだけです。
ファイルの削除が成功したか失敗したかは、戻り値によって返却されます。
trueならば削除成功、falseならば削除失敗です。
JavaSEで使用するFileクラス(java.io.File)のdelete()メソッドもこれと同じ仕様です。
スポンサーリンク




他のアプリケーションのローカルファイルの読込み方法

それでは最後に、他のアプリケーションが保存したローカルファイルの読込み方法について説明します。
先ほどの読込みの例で、説明します。


try{
  Context ctxt = createPackageContext(“パッケージ名”,0);
  InputStream in = ctxt.openFileInput(“a.txt”);
  BufferedReader reader =
     new BufferedReader(new InputStreamReader(in,”UTF-8″));
  String s;
  EditText et = (EditText)findViewById(R.id.edittext01);
  while((s = reader.readLine())!= null){
    et.append(s);
    et.append(“\n”);
  }
  reader.close();
}catch(Exception e){
  //IOExceptionとNameNotFoundExceptionをキャッチしないとダメ
  //手抜きでExceptionをキャッチさせてます!
  e.printStackTrace();
}
自分のアプリケーションで保存したローカルファイルを読み込むときと違うのは、上記サンプルコード内の太字部分のみです。
以前紹介したプリファレンスでも、他のアプリで保存したプリファレンスの読込み方を説明しましたが、それと同じで、createPackageContext()メソッドを使って取得したContextインスタンスを使います。
このContextインスタンスのopenFileInput()メソッドを使えばいいのです。

もちろん、ローカルファイル作成時に、他アプリからの読込みを許可するという設定にしておく必要があります。


別アプリで作成したローカルファイルも扱えますので、プリファレンスと同様、アイデア次第で様々なことが出来そうです。
プリファレンスを使うか、ローカルファイルを使うかは場合に応じて使い分けましょう。

ちなみに、プリファレンスに関する記事は下記です。
Androidアプリのデータ保存方法の一つ「プリファレンス」の使い方


なお、Androidエミュレータ上で動作させた場合に、保存したローカルファイルの内容を見たい!という場合があると思います。
以下の記事に書いてますので、参考にしてください。
ローカルファイルの保存先について