うさがにっき

読書感想文とプログラムのこと書いてきます

Androidにおけるファイル入出力

概要

Androidにおけるファイル入出力をまとめる

詳細

Androidにおけるファイル入出力も基本的にはJavaと同じ
以下のメソッドを使って行う

テキストファイルの読み書き

バイナリファイルの読み書き

バイトストリームから文字ストリームの変換

読み書きのバッファリング処理

文字ストリーム
バイトストリーム

Androidでのファイル操作

Androidではアプリからアクセスできるフォルダーが制限されている
このフォルダーはAndroidOS Verによって違うため以下のメソッドによってアクセスできるフォルダを取得する

BufferedReader reader = null;
BufferedWriter writer = null;

try {
	reader = new BufferedReader(new InputStreamReader(openFileInput("input.dat"), "UTF-8"));
	writer = new BufferedWriter(new OutputStreamReader(openFileOutput("input.dat", MODE_PRIVATE), "UTF-8"));

	int data;
	while((data = reader.read()) != -1) {
		writer.write(data);
	}
	writer.flush();
}catch(IOException e) {
	e.printStackTrace();
}finally {
	try {
		if(reader != null) { reader.close(); }
		if(writer != null) { writer.close(); }
	}catch(IOException e) {
		e.printStackTrace();
	}
}

Androidで一時ファイルを作成する

一般的に一時ディレクトリを作成する時はcreateTempFileメソッドを使う
例えば、以下のコードであれば「C:tmp」フォルダーはいかにTEMP_xxxx.dat(xxxxはランダム)のような一時ファイルを作成する

File temp = File.createTempFile("TMP_", ".dat", new File("C:tmp"));
// 仮想マシン終了タイミングで削除
temp.deleteOnExit();

このメソッドを使う時に最後のdirを省略してはダメ
省略した場合「java.io.tmpdir」で指定されたパスを利用する、これがAndroidのVerによって全然違う場所を指している
4.1以下では/sdcard下を見ていたりするのでpermissionを触らなければいけなかったりする
環境によって挙動が違うのはすごく嫌なので引数dirを省略せずに、以下のように記述する
getCacheDirメソッドはキャッシュフォルダーを取得する

File temp = File.createTempFile("TMP_", ".dat", context.getCacheDir());

その他にもEnviromentクラスを使うことで様々な環境依存のパスを取得できる
環境によって変動するパス情報はハードコーディングするのではなくEnviromentクラスを使うようにする

getDataDirectory() データフォルダ
getDownloadCacheDirectory() ダウンロード、キャッシュフォルダー
getExternalStorageDirectory() 外部ストレージのフォルダ
getRootDIrectory() ルートフォルダ