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

简介: Android res/raw文件以及raw与res/assets异同通常,如果Android开发者有些文件比如音频,视频,.html,.mp3等等这些文件不希望编译器编译而保持原始原貌打包进apk文件(这在游戏开发中很常见和普遍,如游戏用到的游戏音乐、图等资源),那么可以使用Android在res目录下的res/raw和res/assets来保存。


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目录下文件为只读。

给出一个读取raw数据的例子。

事先现在res目录下新建一个目录raw,然后在里面新建一个名为:zhangphil.txt的文件,该文件只有一行简单的字符串,注意编码格式是UTF-8,如图:



然后写Java代码:

package zhangphil.raw;

import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		// setContentView(R.layout.activity_main);

		readRaw();
	}

	private void readRaw() {
		InputStream is = getResources().openRawResource(R.raw.zhangphil);

		try {
			byte[] buffer = readByteDataFromInputStream(is);
			String s = new String(buffer, 0, buffer.length, "UTF-8");
			Log.d("读取到的raw数据", s);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	private byte[] readByteDataFromInputStream(InputStream is) throws IOException {
		BufferedInputStream bis = new BufferedInputStream(is);

		ByteArrayOutputStream baos = 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;

			baos.write(buf, 0, c);
		}

		is.close();

		byte[] data = baos.toByteArray();
		baos.flush();

		return data;
	}
}


代码运行结果输出:



附录我写的相关参考文章:
【文章1】《Android读取assets目录下文件数据内容》链接地址:http://blog.csdn.net/zhangphil/article/details/48247541

相关文章
|
3月前
|
ARouter Android开发
Android不同module布局文件重名被覆盖
Android不同module布局文件重名被覆盖
|
5月前
|
Java Android开发 C++
Android Studio JNI 使用模板:c/cpp源文件的集成编译,快速上手
本文提供了一个Android Studio中JNI使用的模板,包括创建C/C++源文件、编辑CMakeLists.txt、编写JNI接口代码、配置build.gradle以及编译生成.so库的详细步骤,以帮助开发者快速上手Android平台的JNI开发和编译过程。
382 1
|
2月前
|
开发工具 Android开发 Swift
探索iOS与安卓应用开发的异同点
【10月更文挑战第24天】本文通过比较iOS和安卓开发环境,旨在揭示两大移动平台在开发过程中的相似性与差异性。我们将探讨开发工具、编程语言、用户界面设计、性能优化及市场分布等方面,以期为开发者提供全面的视角。通过深入浅出的分析,文章将帮助读者更好地理解每个平台的独特之处及其对应用开发的影响。
|
3月前
|
ARouter Android开发
Android不同module布局文件重名被覆盖
Android不同module布局文件重名被覆盖
186 0
|
4月前
|
IDE 开发工具 Android开发
探索iOS与安卓应用开发的异同
在数字时代的浪潮中,移动应用开发成为连接用户与企业的桥梁。本文将深入探讨iOS和安卓这两大主流平台在应用开发上的差异与共通之处,从技术架构、开发工具、市场定位到用户群体等方面进行全面分析,旨在为开发者提供清晰的指导和参考。通过比较这两个系统的开发环境,我们将揭示它们各自的优势和挑战,以及如何根据项目需求选择合适的平台。
|
5月前
|
开发工具 git 索引
repo sync 更新源码 android-12.0.0_r34, fatal: 不能重置索引文件至版本 ‘v2.27^0‘。
本文描述了在更新AOSP 12源码时遇到的repo同步错误,并提供了通过手动git pull更新repo工具来解决这一问题的方法。
194 1
|
5月前
|
安全 Android开发 iOS开发
探索安卓与iOS开发:异同与未来趋势
在数字时代,安卓和iOS两大移动操作系统引领着全球智能手机市场。本文将深入分析这两个平台的开发环境、用户体验和安全性的异同,并探讨它们面临的挑战与未来的发展趋势。通过比较学习,开发者可以更好地把握跨平台开发的策略,同时预测技术演进的方向。
|
5月前
|
移动开发 Java Android开发
安卓与iOS开发:异同探析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自占据半壁江山。本文旨在深入探讨这两个平台在开发环境、编程语言、用户界面设计、性能优化及市场分布等方面的异同,为开发者提供实用的比较视角和决策参考。通过对比分析,我们不仅能更清晰地认识到各平台的特性,还能洞察未来移动开发的可能趋势。
|
5月前
|
存储 监控 数据库
Android经典实战之OkDownload的文件分段下载及合成原理
本文介绍了 OkDownload,一个高效的 Android 下载引擎,支持多线程下载、断点续传等功能。文章详细描述了文件分段下载及合成原理,包括任务创建、断点续传、并行下载等步骤,并展示了如何通过多种机制保证下载的稳定性和完整性。
164 0
|
5月前
|
Android开发 Swift iOS开发
探索iOS和安卓应用开发的异同
【8月更文挑战第23天】本文通过对比分析,揭示了iOS和安卓两大移动操作系统在应用开发领域的相似性与差异性。从开发者的角度出发,深入探讨了两者的开发环境、编程语言、用户界面设计以及市场策略等方面的区别,并提供了相应的见解和建议。旨在为即将进入这一领域的新手开发者提供指导,同时也为经验丰富的开发者提供新的视角。