通常,如果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目录下文件为只读。


目录视图:


java代码:

<span style="font-size:14px;">package com.example.assetsraw;import java.io.BufferedInputStream;import java.io.ByteArrayOutputStream;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import android.app.Activity;import android.content.res.AssetManager;import android.content.res.AssetManager.AssetInputStream;import android.os.Bundle;import android.util.Log;import android.view.Menu;import android.view.MenuItem;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);new Thread(new Runnable() {@Overridepublic void run() {readRaw();}}).start();readRaw();readAssets();}private void readAssets(){AssetManager assets = getAssets();InputStream in;try {in = assets.open("test");byte[] buffer = getByteFromInputStream(in);String str = new String(buffer, 0, buffer.length, "utf-8");Log.d("2222", str);} catch (IOException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}}private void  readRaw(){InputStream in = getResources().openRawResource(R.raw.text);byte[] buffer;try {buffer = getByteFromInputStream(in);String str = new String(buffer, 0, buffer.length, "utf-8");Log.d("11111", str);} catch (IOException e) {e.printStackTrace();}}private byte[] getByteFromInputStream(InputStream inputStream) throws IOException{BufferedInputStream bis = new BufferedInputStream(inputStream);ByteArrayOutputStream bos = 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;bos.write(buf, 0, c);}bis.close();byte[] buffer = bos.toByteArray();bos.flush();bos.close();return buffer;}}</span>


更多相关文章

  1. NPM 和webpack 的基础使用
  2. 【阿里云镜像】使用阿里巴巴DNS镜像源——DNS配置教程
  3. 一个Android登陆/注册XML布局文件代码
  4. 安卓-编译过程简述
  5. 由安装Busybox到Android过程中想到的
  6. Android与后端(javaweb)数据交互,包含文件(流传输)、json、html文本
  7. Android(安卓)资源(resource)学习小结
  8. android应用程序快速启动秘诀
  9. android应用程序分享,蓝牙文件传输(代码)

随机推荐

  1. android模拟器设置代理上网
  2. 【Android(安卓)framework】AndroidManag
  3. android:allowClearUserData
  4. 安卓自定义属性,Android(安卓)studio无法
  5. 界面有Edittext时有些手机进入界面会自动
  6. android之ListView的item布局问题总结
  7. android工程导出成为jar包。
  8. Android实现ListView异步加载图片
  9. Java,Android Integer和byte的相互转换,Jav
  10. 用ndk-build 工具手动生成编译android原