エミュレータにテスト・ファイルを送りたい。
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 なんかを作り、そこに格納しておく必要がある。