assets目录下和raw目录下文件的区别与读取

来源:互联网 发布:php vendor文件夹 编辑:程序博客网 时间:2024/06/07 10:21

经常会使用到这两个路径下的文件,特别是希望使用这里的数据进行模仿访问互联网读取数据;
两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制。

res/raw和assets的不同点:
1.
res/raw中的文件会被映射到R.java文件中,访问的时候直接使用资源ID即R.id.filename;assets文件夹下的文件不会被映射到R.java中,访问的时候需要AssetManager类;
2.
res/raw不可以有目录结构,而assets则可以有目录结构assets支持任意深度的子目录也就是assets目录下可以再建立文件夹;

res/raw:存放通用的文件, 该文件夹内的文件将不会被编译成二进制文件,按原样复制到设备上;

res:用于存放应用程序的资源(如图标、GUI布局等),将被打包到编译后的Java中。不支持深度子目录;

res/xml: 存放通用的XML文件

读取方式不同:
读取res/raw下的文件资源
InputStream is = getResources().openRawResource(R.id.filename);  

读取assets下的文件资源
AssetManager am  = getAssets();  
InputStream is = am.open("filename.txt");  

这里读取数据的方便之处在于不用涉及到sd卡,并且不用任何文件读写权限

public class MainActivity extends Activity {private String tag = "MainActivity";private TextView textView1;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);textView1 = (TextView) findViewById(R.id.textView1);findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// readAssetsFile();readRawFile();}});}// / 读取assets目录下的文件private void readAssetsFile() {AssetManager assetManager = null;assetManager = this.getAssets();try {InputStream inputStream = assetManager.open("msg.txt");ByteArrayOutputStream outputStream = null;outputStream = new ByteArrayOutputStream();byte[] buffer = new byte[1024];int length = 0;length = inputStream.read(buffer);while (length != -1) {outputStream.write(buffer, 0, length);length = inputStream.read(buffer);}byte[] data = outputStream.toByteArray();String result = new String(data, "utf-8");Log.i(tag, result);textView1.setText(result);} catch (IOException e) {e.printStackTrace();}}// / 读取res/raw目录下的文件private void readRawFile() {try {InputStream inputStream = getResources().openRawResource(R.raw.msgraw);ByteArrayOutputStream outputStream = null;outputStream = new ByteArrayOutputStream();byte[] buffer = new byte[1024];int length = 0;length = inputStream.read(buffer);while (length != -1) {outputStream.write(buffer, 0, length);length = inputStream.read(buffer);}byte[] data = outputStream.toByteArray();String result = new String(data, "UTF-8");Log.i(tag, result);textView1.setText(result);} catch (IOException e) {e.printStackTrace();}}}


因为编码问题,可以这样读取utf-8的文件:

private String readDataAssets() {try {InputStream is = getAssets().open("msg.txt");ByteArrayOutputStream bo = new ByteArrayOutputStream();int i = is.read();while (i != -1) {bo.write(i);i = is.read();}// 因为文件编码与工程均为UTF-8所以可以这样返回,如果不一致,会出现乱码return bo.toString();} catch (IOException e) {return e.toString();}}


较之两者的区别,一个支持R文件直接读取方便,一个支持任意深度子目录,视实际情况而定;




0 0