リソースからのファイルコピー

 エミュレータにテスト・ファイルを送りたい。
 WebからDownLoadする、コンソールからwgetする…?
 いろいろやり方はあるけど、リソースからコピーできると便利。
 「デモファイルのインストール」なんて機能にもなるしね。

 やり方はシンプルなコピーとそう変わりがない。
 リソースのpathを取得するには、Resources class を使うのだが。
 このResources からは、InputStream しか生成できない。
 そのため、FileChannel は使えないんだ。

 下記サンプルでは、SDカードのルートにファイルをコピーしている。

	public void cpResTo_SD( Context context, int res_id, String fName ) {
		
		// Copy先の取得
		File cpFile = new File( Environment.getExternalStorageDirectory().getPath()+"/" +fName );
//	Log.d( "TEST", "copy to :" +cpFile.getPath() );
	
		// exec copy
		try{
			
			Resources res = context.getResources();
			
			InputStream is = res.openRawResource( res_id );
			OutputStream os = new FileOutputStream( cpFile );

			byte[] buffer = new byte[ 1024*4 ];	// 1024*4 = DEFAULT BUFFER SIZE
			int r = 0;
			while( -1 != ( r = is.read(buffer)) ){
				os.write( buffer, 0, r );
			}

			is.close();
			os.close();
			
		}catch( Exception ex ){
			Log.d( "TEST", "/res -> copy error..." );
		}
		//--
	}

 DEFAULT BUFFER SIZE が 1024*4 となっているのは、ファイルの最小サイズが4kだから。
 これより大きくても、小さくても問題ないけど、4kにしておくのが一番、効率がいい。

 注意点としては、リソースの場所があげられる。
 たとえばテキスト・ファイルなんかを、/values に格納するとeclipse でエラーとなる。
 /raw なんかを作り、そこに格納しておく必要がある。

Posted in File, コピー. Tags: , , . リソースからのファイルコピー はコメントを受け付けていません »

ファイルのコピー

 ↓で、できるかと思ったら、できなかった…orz
 File file.renameTo( File newPath );

 じゃ、InputStream で読み込んで、OutputStream で書き出して、読み込んで書き出して…
 と、ループしなきゃならないのか。
 それは面倒…。
 なんて思ってたら、FileChannel を使うとよいらしい。

 下記、例では、アプリのプリファレンスをSDへコピーしている。

	public void cpTo_sd( ) {
		
		File file = new File( Environment.getDataDirectory().getPath()+"/data/" 
				+ this.getPackageName()
				+"/shared_prefs/pref.xml" );

		File cpFile = new File( Environment.getExternalStorageDirectory().getPath()
				+"/pref.xml" );

		try{
			FileChannel channel_In = new FileInputStream( file ).getChannel();
			FileChannel channel_Out = new FileOutputStream( cpFile ).getChannel();

			channel_In.transferTo( 0, channel_In.size(), channel_Out );

			channel_In.close();
			channel_Out.close();

		}catch( Exception ex ){
			Log.d( "TEST", "->sd : copy error..." );
		}
		//--
	}

 FileChannel には、他にもlock や読み込み位置の指定などがあり、色々と使えそうである。
http://developer.android.com/reference/java/nio/channels/FileChannel.html

Posted in File, コピー. Tags: , , , . ファイルのコピー はコメントを受け付けていません »