Android res/raw文件以及raw与res/assets异同

通常,如果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 {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		new Thread(new Runnable() {
			
			@Override
			public 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 block
			e1.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>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值