2013年6月2日日曜日

Android File(保存したい)

さて, 前回は, アプリケーションにファイルを同梱したい場合について書きました。 

Android のファイルに関するネタを3つほどその第二弾です

次に, アプリケーションで生成したファイルをどこに保存してそして, 利用するかです。 

アプリケーションで生成したファイルを保存する場所としては

 1. アプリケーション領域

 2. 内部ストレージ, SDカードなど外部ストレージ

 3. クラウドなど, 外のマシン

 まぁ, 3はおいておきまして...1,2の戦略をとります

1. アプリケーション領域

アプリケーション領域は, このアプリケーションで利用するためだけに使うための領域です
設定ファイルとか, 何かしらで必要なデータをここに入れておきます

ここへの書き込みや読み取り用Streamは, Context が専用のメソッドを用意してくれています
(サンプル2へ)

2. SDカードなど外部ストレージ

写真のデータや音楽など, 共有したり, 持ち出したりしたいファイルはここに入れます
サイズの大きいファイルもここの方がいいかもしれません。


○サンプル1(取得できるディレクトリなど)

File data = getFilesDir();  // Application
Log.i("FilesDir", data.getAbsolutePath());
  
// External Storage
  
File root = Environment.getRootDirectory();
Log.i("Environment root", root.getAbsolutePath());
  
File exterlStorage = Environment.getExternalStorageDirectory();
Log.i("Environment External", exterlStorage.getAbsolutePath());
  
File downloadCache = Environment.getDownloadCacheDirectory();
Log.i("Environment Download Cache", downloadCache.getAbsolutePath());
  
  
File dcim = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
Log.i("DCIM", dcim.getAbsolutePath());
  
File alarms = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_ALARMS);
Log.i("ALARMS", alarms.getAbsolutePath());
  
File downloads = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
Log.i("DOWNLOADS", downloads.getAbsolutePath());
  
File movies = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES);
Log.i("MOVIES", movies.getAbsolutePath());
  
File music = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC);
Log.i("MUSIC", music.getAbsolutePath());
  
File notifications = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_NOTIFICATIONS);
Log.i("NOTIFICATIONS", notifications.getAbsolutePath());
  
File pictures = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
Log.i("PICTURES", pictures.getAbsolutePath());
  
File podcasts = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PODCASTS);
Log.i("PODCASTS", podcasts.getAbsolutePath());
  
File ringtones = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_RINGTONES);
Log.i("ROIGTONES", ringtones.getAbsolutePath());

○テストプログラムの結果です
・Emulator の場合 Android 4.0.3

FilesDir/data/data/com.atmarkplant.forblog/files
Environment root/system
Environment External/mnt/sdcard
Environment DownloadCache/cache
DCIM/mnt/sdcard/DCIM
ALARMS /mnt/sdcard/Alarms
DOWNLOADS /mnt/sdcard/Download
MOVIES/mnt/sdcard/Movies
NOTIFICATIONS/mnt/sdcard/Notifications
PICTURES/mnt/sdcard/Notifications
PODCASTS/mnt/sdcard/Notifications
NOTIFICATIONS/mnt/sdcard/Notifications

・Nexus7 SDカードなしの場合 Android 4.2.2
FilesDir/data/data/com.atmarkplant.forblog/files
Environment root/system
Environment External/strage/emulated/0
Environment DownloadCache/cache
DCIM/strage/emulated/0/DCIM
ALARMS /strage/emulated/0/Alarms
DOWNLOADS /strage/emulated/0/Download
MOVIES/strage/emulated/0/Movies
NOTIFICATIONS/strage/emulated/0/Notifications
PICTURES/strage/emulated/0/Notifications
PODCASTS/strage/emulated/0/Notifications
NOTIFICATIONS/strage/emulated/0/Notifications


・Fujitsu F-10D の場合 Android 4.0.3
FilesDir/data/data/com.atmarkplant.forblog/files
Environment root/system
Environment External/mnt/sdcard
Environment DownloadCache/cache
DCIM/mnt/sdcard/DCIM
ALARMS /mnt/sdcard/Alarms
DOWNLOADS /mnt/sdcard/Download
MOVIES/mnt/sdcard/Movies
NOTIFICATIONS/mnt/sdcard/Notifications
PICTURES/mnt/sdcard/Notifications
PODCASTS/mnt/sdcard/Notifications
NOTIFICATIONS/mnt/sdcard/Notifications

やはり, SDCard スロットのない, Nexus 7 では, 内部のストレージ /strage/emulated/0 にある模様
adb コマンドで確認済み


○サンプル2(アプリケーション領域の読み書き)
private void write()
{
 BufferedWriter bw = null; 
 try
 {
  FileOutputStream os = openFileOutput("data.txt", MODE_PRIVATE); // Open file under application dir
  bw = new BufferedWriter(new OutputStreamWriter(os));
  bw.write("Hello Japan!");
 }
 catch ( Exception oops )
 {
  oops.printStackTrace();
 }
 finally
 {
  if ( bw != null )
  {
   try
   {
    bw.close();
   }
   catch ( IOException oops )
   {
    oops.printStackTrace();
   }
  }
 }
}

private void read()
{
 BufferedReader br = null;
 try
 {
  FileInputStream is = openFileInput("data.txt");
  br = new BufferedReader(new InputStreamReader(is));
  String line;
  while( (line = br.readLine()) != null)
  {
   Log.i(TAG, line);
  }
 }
 catch ( Exception oops )
 {
  oops.printStackTrace();
 }
 finally
 {
  if ( br != null )
  {
   try
   {
    br.close();
   }
   catch ( IOException oops )
   {
    oops.printStackTrace();
   }
  }
 }
}


この形で, ファイルの読み書きができますアプリケーション領域に関しては, 特別なメソッドが利用できます
メソッド内容
openFileInput(String name)ファイルの入力を取得FileInputStream
openFileOutput(String name, int mode)ファイルの出力を取得FileOutputStream)
deleteFile(String name)ファイルの削除
abstract String[] fileList()ファイルリストの取得(パス)

※File (java.io.File)のインスタンスが手に入れば, われわれJava 野郎のターンです。
mkdir,  createTempFile とか, File クラスにまつわる


当然, サブディレクトリをつくることもできますし, そこにデータを置いとけます


0 件のコメント:

コメントを投稿