Android中资源文件夹res/raw和assets的使用

来源:互联网 发布:营销软件下载 编辑:程序博客网 时间:2024/04/28 20:30

*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下的文件资源,通过以下方式获取输入流来进行写操作

view plaincopy to clipboardprint?

  • InputStream is = getResources().openRawResource(R.raw.filename);  


2.读取assets下的文件资源,通过以下方式获取输入流来进行写操作

view plaincopy to clipboardprint?

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


补充一下:在未知目录下有哪些文件,该去和获取这些文件的名称并把文件拷贝到目标目录中呢?(用于内置文件但不知道文件名称,需要筛选出想要的文件然后拷贝到目标目录中,推荐内置在assets文件夹中)
1.res/raw目录:
InputStream is = getResources().openRawResource(R.raw.filename);通过这个方法获得raw中的文件流,读取大家应该都会。
2.assets目录:
getAssets().list("");来获取assets目录下所有文件夹和文件的名称,再通过这些名称再读取我们想要的文件。


上次说到Android中资源文件夹res/raw和assets的使用,但是在读取这两个资源文件夹中的文件时会有一定的限制,即单个文件大小不能超过1M,如果读取超过1M的文件会报"Data exceeds UNCOMPRESS_DATA_MAX (1314625 vs 1048576)"的IOException。
解决方法如下(假设我们现在要把一个超过1M的文件在程序启动时拷贝到sdcard中)
1.先把需要拷贝的大文件分割成若干个大小小于1M的小文件(事先写个程序来分隔或者使用一些工具,我这里直接写了个程序),把这些
小文件放在assets文件夹中;2.在程序启动时我们获取这些小文件的文件名,当然我们得事先规定小文件的命名方式方便我们来获取这些文件名;
3.通过获得的小文件名分别建立输入流来合并成一个大文件,并拷贝到sdcard中。

下面是解决方法中需要用到的一些代码,仅供参考,不妨自己写。分割大文件的方法:

  1.   
  2. public static void main(String[] args) throws Exception {  
  3.     // 大文件放置的路径  
  4.     String path = "D:/";  
  5.     // 大文件的文件名称  
  6.     String base = "demo";  
  7.     String ext = ".db";  
  8.     // 以每个小文件1024*1024字节即1M的标准来分割  
  9.     int split = 1024 * 1024;  
  10.     byte[] buf = new byte[1024];  
  11.     int num = 1;  
  12.     // 建立输入流  
  13.     File inFile = new File(path + base + ext);  
  14.     FileInputStream fis = new FileInputStream(inFile);  
  15.     while (true) {  
  16.         // 以"demo"+num+".db"方式来命名小文件即分割后为demo1.db,demo2.db,。。。。。。  
  17.         FileOutputStream fos = new FileOutputStream(new File(path + base  
  18.                 + num + ext));  
  19.         for (int i = 0; i < split / buf.length; i++) {  
  20.             int read = fis.read(buf);  
  21.             fos.write(buf, 0, read);  
  22.             // 判断大文件读取是否结束  
  23.             if (read < buf.length) {  
  24.                 fis.close();  
  25.                 fos.close();  
  26.                 return;  
  27.              
  28.          
  29.         fos.close();  
  30.         num++;  
  31.     }  
  32. }
获取输入流来合并文件,我们这里以assets文件夹下的文件为例,raw文件夹下如何获取输入流请参考之前的那篇博文。
  1.   
  2. private void mergeApkFile(Context c, ArrayList<String> partFileList, String dst) throws IOException {  
  3.     if (!new File(dst).exists()) {  
  4.         OutputStream out = new FileOutputStream(dst);  
  5.         byte[] buffer = new byte[1024];  
  6.         InputStream in;  
  7.         int readLen = 0;  
  8.         for(int i=0;i<partFileList.size();i++){  
  9.             // 获得输入流  
  10.             in = c.getAssets().open(partFileList.get(i));  
  11.             while((readLen = in.read(buffer)) != -1){  
  12.                 out.write(buffer, 0, readLen);  
  13.              
  14.             out.flush();  
  15.             in.close();  
  16.          
  17.         // 把所有小文件都进行写操作后才关闭输出流,这样就会合并为一个文件了  
  18.         out.close();  
  19.     }  
  20.  
这样就OK了,大文件已经拷贝到你需要的路径中了。
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 20岁了不知道自己该干什么怎么办 遇到一个新手买家恶意拍下怎么办 淘宝卖螃蟹有什么要求美工怎么办 淘宝衣服吊牌剪了想退货怎么办修 用图片在淘宝搜衣服搜不到怎么办 汽车黑塑料水砂纸磨的不平怎么办 sat报名要你填10位电话怎么办 手绘板连接电脑绘画有点迟钝怎么办 走路不小心滑了一下特尴尬怎么办 小孩子头撞了头发长不出来怎么办 小孩子头磕破了不长头发怎么办 晚上洗了冷水头早上头痛怎么办 头发洗了一天就油了怎么办 米诺地尔搽剂喷了头皮油怎么办 头发可以种植吗如果是秃顶怎么办 前额头发少怎么办如何使头发增多 头发又细又软又少怎么办 宝宝一岁了头发又少又黄怎么办 生完孩子头发掉的厉害怎么办 洗完头发后头发很蓬松怎么办 头发掉的厉害怎么办吃什么好得快 头发掉的很厉害怎么办吃什么好 我头发掉的厉害怎么办吃什么药 头发干枯毛躁掉发怎么办吃什么 最近洗头时头发掉的厉害怎么办 生完小孩头发掉的厉害怎么办 生完小孩后头发掉的厉害怎么办 生完孩子后严重掉头发怎么办 生过孩子后掉头发严重怎么办 孩孑16岁了高中没考上怎么办 小孩的嘴巴里有点点该怎么办 小孩从出生哭笑嘴巴有点歪怎么办 儿童耳朵受伤后嘴巴歪了怎么办 手机锁屏图案忘了怎么办求解锁 忘给仓鼠买吃的了怎么办 两岁宝宝不爱吃饭只喝奶粉怎么办 下载百度云压缩包要提取密码怎么办 微信表情包图片过大无法添加怎么办 管理员吧群员全部踢了群主怎么办 微信笑脸表情斗图文字没有了怎么办 钨珠钢笔头用完笔墨了怎么办