ファイルへデータを保存する
ここではファイルにデータを保存する具体例として、画面に入力したファイル名、内容でファイルを作ってデータを保存するプログラムを作りましょう。
ちなみに、私の端末 (DROID X) では adb shell を使ったときに ls などが利用できなかったので、ここではテスト用にエミュレータを利用しています。
サンプルプログラムの動作
ここで作るプログラムは次のような動作になります。
画面は次の通り、ファイル名を入力するテキストボックスとファイルの内容の文字を入力するテキストボックスがあります。
スクリーンショットの例では、ファイル名として "file1.txt"、 その内容として "Hello, world!" という文字列を入力しています。 Save ボタンを押すと、"file1.txt" というファイルに "Hello, world!" という内容が書かれ保存されます。
実際にどこにどういう風に保存されたか見る前に、このボタンを押したときの処理をみてみましょう。
ファイルに文字列を保存する基本的なコードは次のとおりです。
protected void saveText(){
String message = "";
String fileName = filenameText.getText().toString();
String inputText = contentText.getText().toString();
try {
FileOutputStream outStream = openFileOutput(fileName, MODE_PRIVATE);
OutputStreamWriter writer = new OutputStreamWriter(outStream);
writer.write(inputText);
writer.flush();
writer.close();
message = "File saved.";
} catch (FileNotFoundException e) {
message = e.getMessage();
e.printStackTrace();
} catch (IOException e) {
message = e.getMessage();
e.printStackTrace();
}
Toast.makeText(getBaseContext(), message, Toast.LENGTH_LONG).show();
}
上の例では fileName、inputText という String にはそれぞれ、 "file1.txt"、"Hello, world!" という値がセットされます。
openFileOutput で FileOutputStream を取得、それに対して OutputStreamWriter で文字を書き込みます。
実はこれだけで、アプリケーション固有のインターナルストレージにファイルが保存されます。 アプリケーション固有のファイルは、/data/data/パッケージ名/files 以下に保存します。
実際にこれを動作させた結果は次の通りになります。
確かに file1.txt というファイルが出来上がっています。
$ ./adb -d shell
としてエミュレータに接続するとコマンドを実行できます。パッケージのパスまできて、 ファイルを確認すると、確かにファイルに文字列が保存されています。
# pwd /data/data/com.keicode.android.test/files # ls file1.txt # cat file1.txt Hello, world!
コードではパスを指定していないのにちゃんと "/data/data/com.keicode.android.test/file" という場所にファイルが作られました。 確かに com.keicode.android.test というのはこのサンプルプログラムのパッケージ名です。
尚、アプリケーション固有のファイルについては上記で示した /data/data/.../files ディレクトリに保存しますが、 例えば音楽ファイルや画像など、アプリケーションをアンインストールしても同時に削除する必要がない(あるいはすべきではない)ファイルについては、 SD カードのパブリックディレクトリに保存します。この点についてはまた別の機会に書きます。