res/raw和assets的相同点:
1.两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制。
res/raw和assets的不同点:
1.res/raw中的文件会被映射到R.java文件中,访问的时候直接使用资源ID即R.id.filename;assets文件夹下的文件不会被映射到R.java中,访问的时候需要AssetManager类。
2.res/raw不可以有目录结构,而assets则可以有目录结构,也就是assets目录下可以再建立文件夹
*读取文件资源:
1.读取res/raw下的文件资源,通过以下方式获取输入流来进行写操作
- InputStream is = getResources().openRawResource(R.id.filename);
2.读取assets下的文件资源,通过以下方式获取输入流来进行写操作
- AssetManager am = null;
- am = getAssets();
- InputStream is = am.open("filename");
assets文件夹里面的文件都是保持原始的文件格式,需要用AssetManager以字节流的形式读取文件。
1. 先在Activity里面调用getAssets() 来获取AssetManager引用。
2. 再用AssetManager的open(String fileName, int accessMode) 方法则指定读取的文件以及访问模式就能得到输入流InputStream。
3. 然后就是用已经open file 的inputStream读取文件,读取完成后记得inputStream.close() 。
4.调用AssetManager.close() 关闭AssetManager。
需要注意的是,来自Resources和Assets 中的文件只可以读取而不能进行写的操作
以下为Assets文件中读取:
- public class ReadAsset extends Activity
- {
- @Override
- protected void onCreate(Bundle savedInstanceState)
- {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.read_asset);
- try {
- InputStream is = getAssets().open("read_asset.txt");//文件夹下的一个二进制文件
- int size = is.available();
- // Read the entire asset into a local byte buffer.
- byte[] buffer = new byte[size];
- is.read(buffer);
- is.close();
- // Convert the buffer into a string.
- String text = new String(buffer);
- // Finally stick the string into the text view.
- TextView tv = (TextView)findViewById(R.id.text);
- tv.setText(text);
- } catch (IOException e) {
- // Should never happen!
- throw new RuntimeException(e);
- }
- }
- }
- public String getFromRaw(){
- try {
- InputStreamReader inputReader = new InputStreamReader( getResources().openRawResource(R.raw.test1));
- BufferedReader bufReader = new BufferedReader(inputReader);
- String line="";
- String Result="";
- while((line = bufReader.readLine()) != null)
- Result += line;
- return Result;
- } catch (Exception e) {
- e.printStackTrace();
- }