データを簡単に保存する方法(ファイル入出力編)


ローカルファイルへデータ保存する方法について、今回はandroid.content.Contextに用意されているファイル入出力(ファイルI/O)に便利なメソッド、ファイルを読み込むopenFileInput()、書き込みのopenFileOutput()について紹介します。

ファイル入出力メソッド

メソッド名 概要
openFileInput(String name) ローカルファイルの読み込み
openFileOutput (String name, int mode) ローカルファイルへの書き込み
deleteFile(String name) ローカルファイルの削除
abstract String[] fileList() 該当アプリが作成したローカルファイルのリストを取得

このファイル入出力メソッドを利用して作ったファイルは、基本的には作成したアプリケーション専用のローカルファイルになります(private filesと表現しています)。Andeoidでは、セキュリティ上の観点からアプリケーションごとにIDが割り当てられ、別々のアクセス権限をもっています。
openFileOutputメソッドを使えば他のアプリケーションへ読み書きの権限を付与できます。権限付与はアプリケーションごと個別に設定することができず、allかprivateかのどちらかとなりますので、セキュリティには十分、注意してください。

今まで紹介したデータを簡単に保存する方法

続きはサンプルコードです。

ファイルの読み込み

読み込み用ファイル入出力メソッド

  • public abstract FileInputStream openFileInput (String name)

をつかっておこないます。

    private void sampleFileInput(){

       	InputStream in;
		String lineBuffer;

		try {
			in = openFileInput(LOCAL_FILE); //LOCAL_FILE = "log.txt";

			BufferedReader reader= new BufferedReader(new InputStreamReader(in,"UTF-8"));
			while( (lineBuffer = reader.readLine()) != null ){
				Log.d("FileAccess",lineBuffer);
			}
		} catch (IOException e) {
			// TODO 自動生成された catch ブロック
			e.printStackTrace();
		}
    }

openFileInput のエラー処理は、FileNotFoundException が規定値です。サンプルでは簡単化のためにIOException で受けています。9行目で文字コードを指定しています。

ファイルへ書き込む

ファイルへの書き出しはアクセス権限の設定部分があるので読み込みのopenFileInputメソッドより、引数が増えています。

  • public abstract FileOutputStream openFileOutput (String name, int mode)

をつかいます。第2引数のmodeには以下の4つのマクロをOR指定できます。MODE_PRIVATEマクロは0として定義されているので、省略することも可能です。

  • MODE_APPEND: 既にファイルがあった場合、追記で開く
  • MODE_PRIVATE: 他のアプリからアクセスできないprivate fileとして生成
  • MODE_WORLD_READABLE: 他のアプリへ読み込み権限を与える
  • MODE_WORLD_WRITEABLE: 他のアプリへ書き込み権限を与える
  •     private void sampleFileOutput(){
    
    		OutputStream out;
    		try {
    			out = openFileOutput(LOCAL_FILE,MODE_PRIVATE|MODE_APPEND);
    			PrintWriter writer = new PrintWriter(new OutputStreamWriter(out,"UTF-8"));
    
    			//追記する
    			writer.append("write test");
    			writer.close();
    		} catch (IOException e) {
    			// TODO 自動生成された catch ブロック
    			e.printStackTrace();
    		}
        }
    
    3 Comments