Android res/raw文件以及raw与res/assets异同

通常,如果Android开发者有些文件比如音频,视频,.html,.mp3等等这些文件不希望编译器编译而保持原始原貌打包进apk文件(这在游戏开发中很常见和普遍,如游戏用到的游戏音乐、图等资源),那么可以使用Android在res目录下的res/raw和res/assets来保存。res/raw和res/assets目录下的文件将不被Android编译成二进制,Android将这些文件资源保持原状原封不动的打包进最终编译发布时候的apk文件。
res/raw和res/assets和既有相同点也有不同点。
(1)res/raw目录下的文件将被Android映射成R.id.xxx资源,访问该raw目录下的文件资源,可以通过R.id.filename获得映射,进而文件操作。但res/assets则不是这样,res/assets目录下的文件不会进行R.id. filename这样的映射,res/assets目录下的文件存放和访问模型与Java文件系统的读写模型类似。
(2)res/assets目录下的文件结构可以出现层级和树形结构;而res/raw则不能分层级。换句话说,可以在res/assets建立多层级、树形的文件目录结构,而res/raw下的文件资源必须平铺放在res/raw目录下。
(3)文件大小方面。在res/raw目录下的单个文件大小可以大到若干MB的尺寸,但res/assets文件目录下的单个文件大小尺寸尽量控制在MB量级以下,否则可能要出问题。
(4)res/assets目录下的文件资源访问一般是这样(如附录文章1所示):
AssetManager am=getAssets();
InputStream is=am.open("filename");
即通过AssetManager访问res/assets目录下资源。
res/raw目录下的文件资源访问一般是这样:
InputStream is =getResources().openRawResource(R.id.filename);
res/raw目录下的文件资源也可以通过这样先获得URI定位:
Uri uri= Uri.parse("android.resource://"+getPackageName()+"/"+ R.raw.filename);

(5)res/raw和res/assets目录下文件为只读。

给出一个读取raw数据的例子。

先在res目录下新建一个目录raw,然后在里面新建一个名为:aaab.txt的文件,该文件只有一行简单的字符串,注意编码格式选择UTF-8


编辑代码如下:


package com.example.myraw;import java.io.BufferedInputStream;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.InputStream;import android.app.Activity;import android.os.Bundle;import android.util.Log;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//setContentView(R.layout.activity_main);readRaw();}private void readRaw() {//将res/raw文件夹下的aaab.txt文件转换成InputStream输入流InputStream is = getResources().openRawResource(R.raw.aaab);try {byte[] buffer = readByteDataFromInputStream(is);String s = new String(buffer, 0, buffer.length, "UTF-8");Log.d("读到的Raw数据:", s);} catch (IOException e) {e.printStackTrace();}}private byte[] readByteDataFromInputStream(InputStream is)throws IOException {//将输入流is转换成输入缓冲流BufferedInputStream bis = new BufferedInputStream(is);//定义一个字节数组输出流ByteArrayOutputStream baos = new ByteArrayOutputStream();final int BUFFER_SIZE = 2 * 1024;final int EOF = -1;int c;byte[] buf = new byte[BUFFER_SIZE];while (true) {c = bis.read(buf);if (c == EOF)break;//写入到字节数组buf里面baos.write(buf, 0, c);}//关闭流is.close();byte[] data = baos.toByteArray();//刷新流baos.flush();return data;}}

运行结果如下:

Android res/raw文件;raw与res/assets异同_第1张图片



更多相关文章

  1. 全面的Android文件目录解析和获取方法(包含对6.0系统的说明)
  2. Android资源目录 /res/xml /res/raw 和 /assets介绍
  3. Android中使用Pull解析器解析xml文件+进行简单的单元测试
  4. 非root下,如何将android中的数据库文件存放到外部存储并导出
  5. Android WebView加载https页面不能正常显示资源问题
  6. android 将app添加进入文件的打开方式
  7. android:scaleType="matrix"布局文件加载图片时候的显示方式
  8. Android读取sql文件并导入数据库

随机推荐

  1. Android(安卓)使用SAX或者DOM或者pull解
  2. Android(安卓)Container原理分析
  3. 避免内存泄露
  4. Android系列教程之七:EditText使用详解-包
  5. ( 转)关于Android的nodpi,xhdpi,hdpi,mdp
  6. findViewById()使用常见错误
  7. Android应用程序启动过程源代码分析
  8. UI控件之显示文本控件TextView(上)
  9. Android(安卓)设置默认桌面,默认应用,辅
  10. Android(安卓)Matrix