Asset和raw都是资源文件夹,比如可以放置数据库文件,音乐文件等等,这些文件在生成APK的时候不会被转换成二进制文件。
Asset和raw的区别:
一、Assets和res在同一个目录,但是raw在res目录下,并且只有Assets才支持建立子目录。
二、raw中的文件会被映射到R文件中,访问的时候直接使用资源ID即R.raw.*,而assets文件夹下的文件不会被映射到R.Java中,访问的时候需要使用AssetManager类;
assets: InputStream assets = getAssets().open("xxxx");
raw: InputStream raw = getResources().openRawResource(R.raw.xxxx)
raw: InputStream raw = getResources().openRawResource(R.raw.xxxx)
现在给出具体代码显示他们的区别:
复制Assets目录的数据库文件music.db到手机的data目录
private void initSQ() { String DB_PATH = "/data/data/com.yuzhiyun.perfectmusic/databases/"; String DB_NAME = "music.db"; if ((new File(DB_PATH,DB_NAME).exists()) == false) { File dir = new File(DB_PATH); if (!dir.exists()) { dir.mkdir(); } /**数据库复制到该目录*/ try { //看这里,获取输入流 InputStream is = getAssets().open(DB_NAME); OutputStream os = new FileOutputStream(DB_PATH + DB_NAME); byte[] buffer = new byte[2014]; int length; while ((length = is.read(buffer)) > 0) { os.write(buffer,0,length); } os.flush(); os.close(); is.close(); } catch (IOException e) { e.printStackTrace(); } } }
复制raw中文件到手机的data目录
if ((new File(SONGS_PATH,SONGS_NAME).exists()) == false) { File dir = new File(SONGS_PATH); if (!dir.exists()) { dir.mkdir(); } /**歌曲复制到改目录*/ try { //看这里,获取输入流 InputStream is = this.getResources().openRawResource(R.raw.a); FileOutputStream os = new FileOutputStream(SONGS_PATH + SONGS_NAME); byte[] buffer = new byte[2014]; int length; while ((length = is.read(buffer)) > 0) { os.write(buffer,0,length); } os.flush(); os.close(); is.close(); } catch (IOException e) { e.printStackTrace(); }
疑问:
Assets目录看起来功能比raw多,那为什么还需要raw,Android干嘛不直接丢弃掉它。
解答:
raw文件夹下有ID的资源文件在Android XML文件中也可以@raw/的形式引用到它(虽然我暂时没有这样用过)。在Android中,使用ID是访问一个文件最快捷的方式(为什么?我只是听人家讲的),同时,当存在子目录时候,在Assets目录下还需要一个字符串路径来获取这个目录下的文件,访问的速度会更慢。
但是最后我还是要提出一个疑问,希望看到的同学帮忙回答一下,数据库db文件到底是放assets目录好还是放raw目录好??