Android assets 和 res/raw 区别。读取本地网页,读取文本字体样式,读取视频。
res/raw和assets的相同点:
1.两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制。
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