Android assets 和 res/raw 区别。读取本地网页,读取文本字体样式,读取视频。

为君一笑 提交于 2019-12-07 18:22:37

Android assets 和 res/raw 区别。读取本地网页,读取文本字体样式,读取视频。


res/raw和assets的相同点:

1.两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制。


res/raw和assets的不同点:

1.res/raw中的文件会被映射到R.java文件中,访问的时候直接使用资源ID即R.id.filename;assets文件夹下的文件不会被映射到R.java中,访问的时候需要AssetManager类。

raw是Resources (res)的子目录,Android会自动的为这目录中的所有资源文件生成一个ID,这个ID会被存储在R类当中,作为一个文件的引用。这意味着这个资源 文件可以很容易的被Android的类和方法访问到,甚至在Android XML文件中你也可以@raw/的形式引用到它。在Android中,使用ID是访问一个文件最快捷的方式。MP3和Ogg文件放在这个目录下是比较合适 的.

assets: 无法在Android XML文件中引用到assets目录下的文件,只能通过AssetManager来访问这些文件。数据库文件和游戏数据等放在这个目录下是比较合适的。


2.res/raw不可以有目录结构,而assets则可以有目录结构,也就是assets目录下可以再建立文件夹.


读取文件资源:


一、读取 res/raw文件

第一个测试:序列化和反序列化文件读取


		try {
			// 测试序列化数据到文件
			// 第一步先在手机缓存目录生成一个序列化对象的文件
			// 然后将手机中生成的文件拷贝到项目res/raw 中做测试
			// 第二步用ObjectInputStream 反序列化读取对象
			// 创建一个对象
			Person people = new Person("张三", "男");

			// 实例化ObjectOutputStream对象
			ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(MainActivity.this.getExternalCacheDir().getPath() + "/person.text"));
			// 将对象写入文件
			oos.writeObject(people);
			oos.flush();
			oos.close();

			// 实例化ObjectInputStream对象
			//读取raw文件的方法openRawResource。
			InputStream is = getResources().openRawResource(R.raw.person);
			ObjectInputStream ois = new ObjectInputStream(is);

			try {
				// 读取对象people,反序列化
				Person p = (Person) ois.readObject();
				System.out.println("姓名:" + p.getName());
				System.out.println("性别:" + p.getSex());
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			}

		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

在SDK缓存目录下生成一个person.text 的序列化文件

将其拷贝到项目res/raw 中做测试

注意:生成序列化文件和反序列化时,必须保持Person 类没有变化,比如包名,序列化id。都要保持一致。否则反序列化会报错。

public class Person implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;


从raw中读取文件,生成InputStream 流

			//读取raw文件的方法openRawResource。
			InputStream is = getResources().openRawResource(R.raw.person);

第二个测试:读取一个普通文件测试

代码如下:

		//另外一个测试。读取test.text 文件
		BufferedReader bufReader = null;
		InputStreamReader isr = null;
		try {
			InputStream is = getResources().openRawResource(R.raw.test);
			isr = new InputStreamReader(is);
			bufReader = new BufferedReader(isr);
			
			String message = "";
			String line = null;
			while ((line = bufReader.readLine()) != null) {
				message += line;
			}
			System.out.println("message======" + message);

		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}


二、读取assets文件夹下文件:

	public void OpenFileAssets(View v) {
		
		AssetManager am = null;
		am = getAssets();
		InputStream is = null;
		try {
			is = am.open("person.text");
		} catch (IOException e) {
			e.printStackTrace();
		}

		try {
			ObjectInputStream ois = new ObjectInputStream(is);
			try {
				// 读取对象people,反序列化
				Person p = (Person) ois.readObject();
				System.out.println("姓名:" + p.getName());
				System.out.println("性别:" + p.getSex());
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			}

		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

关键读取文件的方法:生成InputStream 

		AssetManager am = null;
		am = getAssets();
		InputStream is = null;
		try {
			is = am.open("person.text");
		} catch (IOException e) {
			e.printStackTrace();
		}

三、将字体样式文件放在 assets 中读取使用:

	public void OpenFont(View v) {
		AssetManager am = getAssets();// 得到AssetManager
		Typeface tf = Typeface.createFromAsset(am, "font/aaa.ttf");// 根据路径得到Typeface。注意文件夹名称。文件名要带文件类型
		vFontText.setTypeface(tf);// 设置字体
	}
注意文件目录,不用写assets,因为方法名就是createFromAsset  。

Typeface 还有如下方法,可能不支持放在raw下读取,没有测试。




四、加载本地Html网页,放在assets中读取。方法如下。

		vWebView.loadUrl("file:///android_asset/webview_error.html");

五、读取项目中的 声音和视频文件,要放在raw 中读取。

播放视频文件

		 vVideoView.setVideoURI(Uri.parse("android.resource://" + "com.example.maintest" + "/" + R.raw.movie));
		 vVideoView.start();

其中 com.example.maintest 项目包名。不要忘记调用start()方法播放视频。


注意:

播放项目工程里面的视频文件,不是播放SD卡视频文件。

开始尝试把视频文件放到 assets文件目录下。

模仿WebView 加载assets 下的Html文件。

我尝试将视频movie.mp4 放到assets目录下.。

结果报错了,无法播放。


播放Android项目工程里的视频文件最终解决办法是:
1. 把视频文件放到项目工程的 res/raw 文件下。
2.视频文件必须是Android支持视频格式(3gp,wmv,mp4),并且命名必须是小写字母,数据,下划线,例如:my_video_file.mp4
3. 当你是在代码里面引用这个资源文件时,你必须使用Rstatics类,同时去掉文件的后缀:R.raw.my_video_file
4. 构造正确的URI


源码

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!