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

本文详细介绍了Android开发中res/raw与assets目录的区别及使用方法,包括如何通过代码访问和读取这两种目录下的文件资源,特别强调了它们在打包过程中的处理方式以及在应用程序中的实际应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

经常会使用到这两个路径下的文件,特别是希望使用这里的数据进行模仿访问互联网读取数据;
两者目录下的文件在打包后会原封不动的保存在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;

	@Override
	protected 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() {

					@Override
					public 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文件直接读取方便,一个支持任意深度子目录,视实际情况而定;




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值