Android File(packed in Application)
We sometimes use file in Android Application.
In that case, we save file into application. Where is it?
Location
We have 2 choices to save file by default.
- res/raw
- assets
Several people explain between 2. So I don’t need additional description about them.
Basically, we use assets, but in case of using sound file or image resource to manage by R.java,
you need to use res/raw.
** res/raw is not existed by default. make it!**
** To manage file in those directory, we can get InputStream only, can’t get File class**
Samples
readFromAssets reads file from assets directory
readFromRaw reads file from res/raw
I saved test1.txt in res/raw, test2.txt in assets
public class ApplicationFileActivity extends Activity { private static String TAG = "Application File"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); readFromAssets(); readFromRaw(); new FileOperations(this).readFromAssets(); } private void readFromAssets() { AssetManager as = getResources().getAssets(); BufferedReader br = null; try { InputStream in = as.open("test2.txt"); br = new BufferedReader(new InputStreamReader(in)); String line; Log.i(TAG, "Assets"); while ( (line = br.readLine()) != null ) { Log.i(TAG, line); } } catch ( IOException oops ) { oops.printStackTrace(); } finally { if ( br != null ) { try { br.close(); } catch(IOException oops ) { oops.printStackTrace(); } } } } private void readFromRaw() { InputStream in = getResources().openRawResource(R.raw.test); // test.txt BufferedReader br = new BufferedReader(new InputStreamReader(in)); String line; try { Log.i(TAG, "Raw"); while ( (line = br.readLine()) != null ) { Log.i(TAG, line); } } catch ( IOException oops ) { oops.printStackTrace(); } finally { if ( br != null ) { try { br.close(); } catch(IOException oops ) { oops.printStackTrace(); } } } } }
Sample2 Use Context
public class FileOperations { private static String TAG = "File Operations"; Context context; public FileOperations ( Context context ) { this.context = context; } public void readFromAssets() { AssetManager as = context.getResources().getAssets(); BufferedReader br = null; try { InputStream in = as.open("test2.txt"); br = new BufferedReader(new InputStreamReader(in)); String line; Log.i(TAG, "Assets"); while ( (line = br.readLine()) != null ) { Log.i(TAG, line); } } catch ( IOException oops ) { oops.printStackTrace(); } finally { if ( br != null ) { try { br.close(); } catch(IOException oops ) { oops.printStackTrace(); } } } } public void readFromRaw() { InputStream in = context.getResources().openRawResource(R.raw.test); // test.txt BufferedReader br = new BufferedReader(new InputStreamReader(in)); String line; try { Log.i(TAG, "Raw"); while ( (line = br.readLine()) != null ) { Log.i(TAG, line); } } catch ( IOException oops ) { oops.printStackTrace(); } finally { if ( br != null ) { try { br.close(); } catch(IOException oops ) { oops.printStackTrace(); } } } } }
To call this from Activity,
new FileOperations(this).readFromAssets();
Problem
Basically, these directory is managed by android.content.Context.
We can’t get file path and can’t get File class.
We can get only InputStream.