assets与raw

来源:互联网 发布:迷雾 电视剧 知乎 编辑:程序博客网 时间:2024/06/14 01:11

二者区别

相同点

两者目录中文件经打包后原封不动保存在apk包中,不同于xml、java文件被平台编译成二进制,可存放图片、html、js、css 等文件,作为原始资源使用。

不同点

  • res/raw中文件会被映射到R.Java文件中,访问时直接使用资源ID,即R.id.filename;assets中文件不会被映射到R.java中,访问时需通过AssetManager类。
  • res/raw中不能有目录结构,而assets中可存在目录结构,即assets目录中可再建文件夹。

raw读取

思路

读取文件时,先把文件一些数据内容读取并保存到缓冲区。若所需内容已在缓冲区,则读取缓冲区数据内容。若缓冲区无所需内容,则先从文件读取数据内容并保存到缓冲区,而后从缓冲区读取数据内容。这样便可减少对文件操作次数,从而提高性能。缺点是需额外内存做缓冲区。

步骤

  • 首先调用Context.getResource获取当前应用程序上下文的Resources引用
  • 然后调用openRawResource(int id)得到InputStream
  • 最后操作InputStream获取数据内容

代码

InputStream is=resources.openRawResource(R.raw.hubin);BufferedInputStream buf = new BufferedInputStream(is);    void readRawFile()    {        String content;        Resources resources=this.getResources();        InputStream is=null;        try{            is=resources.openRawResource(R.raw.hubin);            byte buffer[]=new byte[is.available()];            is.read(buffer);            content=new String(buffer);            Log.i(tag, "read:"+content);        }        catch(IOException e)        {            Log.e(tag, "write file",e);        }        finally        {            if(is!=null)            {                try{                is.close();                }catch(IOException e)                {                    Log.e(tag, "close file",e);                }            }        }            }

注意

资源文件放置在res/raw目录中,R类会自动提供目录中资源文件id,可直接使用。

assets读取

思路

可通过输入流来读取资源文件。

代码

AssetManager am = null;  am = getAssets();  InputStream is = am.open("filename");  

注意

Android系统处理asserts存在bug,AssetManager中不能对单个超过1MB文件进行处理,否则会报异常;raw无此限制。

原创粉丝点击