リソースからファイルをコピー
リソースファイルをローカルにコピーするサンプルです。
リソースファイルをコピーする処理をクラスで実装しています。
import android.content.Context;
import android.util.Log;
import java.io.InputStream;
import java.io.OutputStream;
public class clsResourceToFileCopy {
//iResourceId:INファイルのId
//iResourceId2:OUTファイルのId
public int copyFile(Context context, int iResourceId, int iResourceId2)
{
InputStream input = null;
OutputStream output = null;
String sFileName = "";//出力先ファイル名
clsTemp1 cls = new clsTemp1();
sFileName = cls.getStringXmlData(context, iResourceId2);
Log.d("iResourceId",String.valueOf(iResourceId));
Log.d("sFileName",sFileName);
try
{
input = context.getResources().openRawResource(iResourceId);
//MODE_APPEND
//追加で書き込み
//MODE_PRIVATE
//このアプリのみアクセス許可
//MODE_WORLD_READBLE / MOVE_WORLD_WRITEABLE
//API Level 17 で非推奨となりました。
output = context.openFileOutput(sFileName,Context.MODE_PRIVATE);
//DEFAULT BUFFER SIZE が1024 * 4となっているため
byte[] buff = new byte[1024 * 4];
int size=0;
while ( (size = input.read(buff) ) >= 0 )
{
Log.d("size",String.valueOf(size));
output.write(buff,0,size);
}
output.flush();
output.close();
input.close();
Log.d("copyFile","close end");
}
catch (Exception e)
{
Log.d("Error Message",e.getMessage().toString());
return 1;
}
finally
{
output=null;
input=null;
Log.d("copyFile","set null end");
}
return 0;
}
}
|
ファイルモードは次の値を使用しています。
MODE_APPEND
追加で書き込み
MODE_PRIVATE
このアプリのみアクセス許可
(例)
読み込み側
input = context.getResources().openRawResource(iResourceId);
出力側
output = context.openFileOutput(sFileName,Context.MODE_PRIVATE);
書き込み処理
byte[] buff = new byte[1024 * 4];
int size=0;
while ( (size = input.read(buff) ) >= 0 )
{
Log.d("size",String.valueOf(size));
output.write(buff,0,size);
}
保存処理
output.flush();
各ファイルのIOを閉じます
output.close();
input.close();
クラスの呼び出し側です。
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//ファイル存在チェック
//fileExists();
//ファイル削除
//fileDelete();
//ファイルコピー
fileCopy();
//ファイル移動
//fileMove();
//ファイル作成
//fileCreate();
}
//ファイルコピー処理
private void fileCopy()
{
int iResult = 0;
//ファイルをコピーする処理
Log.d("fileCopy","cls instance");
clsResourceToFileCopy cls = new clsResourceToFileCopy();
Log.d("fileCopy","copyFile method start");
iResult = cls.copyFile(this, R.mipmap.ic_launcher, R.string.png_file_name);
Log.d("iResult", String.valueOf(iResult));
cls = null;
Log.d("fileCopy","end");
}
}
|
パスやファイル名を取得しているクラスです。
import android.content.Context;
import android.util.Log;
public class clsTemp1 {
//strings.xmlから指定した文字列を取得します。
//context:Context
//iResourceId:strings.xmlに定義しているリソースId
public String getStringXmlData(Context context, int iResourceId)
{
//strings.xmlからリソースIDを指定して文字列を取得します。
return context.getString(iResourceId);
}
public String getPath(Context context, String sFileName)
{
//ファイルのパス
String sPath = context.getFilesDir().getAbsolutePath() + "/" + sFileName;
Log.d("sPath", sPath);
/*
//ファイルのパス
StringBuffer sPath = new StringBuffer();
sPath.append(context.getFilesDir());
sPath.append("\\");
sPath.append(sFileName);
Log.d("sPath", sPath.toString());
*/
//ex.)
//sPath: /data/data/test.example.com.test23/files/ic_launcher.png
return sPath;
}
}
|
サンプルに使用しているstrings.xmlです。
<resources>
<string name="app_name">test23</string>
<string name="png_file_name">ic_launcher.png</string>
<string name="png_file_name2">ic_launcher2.png</string>
<string name="png_file_name3">ic_launcher3.png</string>
</resources>
|
|
|