一、概念
相同:
assets/和res/raw/目录下的资源只能读取,不能写入,资源文件在打包后会原封不动的保存在apk包中,不会被编译成二进制文件,可以存放音频、视频文件,文件的大小被限制在1M以下,推荐放入assets目录下。
不同:
● res/raw/中的文件会被映射到R.java文件中,访问的时候直接使用资源ID即R.raw.filename;assets文件夹下的文件不会被映射到R.java中,访问的时候需要AssetManager类;
● res/raw/不可以有目录结构,而assets则可以有目录结构,也就是assets目录下可以再建立文件夹。
二、读取方式
res/raw/目录
InputStream is = getResources().openRawResource(R.id.filename);
assets/目录
InputStream is = getResources().getAssets().open("filename");
三、AssetManager
提供对应用程序的原始资源文件进行访问,这个类提供了一个低级别的API,它允许你以简单的字节流的形式打开和读取和应用程序绑定在一起的原始资源文件。通过getAssets()方法获取AssetManager对象。
常用方法:
final String[] list(String path) //返回指定路径下的所有文件及目录名
final InputStream open(String fileName) //使用 ACCESS_STREAMING模式打开assets下的指定文件
final InputStream open(String fileName, int accessMode) //使用显示的访问模式打开assets下的指定文件
四、AssetFileDescriptor
可以通过AssetManager的openFd()的方法获取asset目录下指定文件的AssetFileDescriptor对象。
常用方法:
FileInputStream createInputStream() //为asset创建并返回一个自动关闭的输入流
FileOutputStream createOutputStream() //为asset创建并返回一个自动关闭的输出流
FileDescriptor getFileDescriptor() //返回可用于读取文件中的数据的FileDescriptor对象
long getLength() //返回该asset中项的数据的总字节数
long getStartOffset() //返回asset中项的数据字节开始偏移
五、使用方法
将assets文件夹下的文件拷贝到/data/data/下
因为assets文件夹下的文件只能读,不能写,而且有1M的限制,超过1M无法读取,所以我们有时要把assets文件夹下的文件拷贝到/data/data/下然后操作文件。
/**
* 将assets文件夹下的文件拷贝到/data/data/下
*
* @param context
* @param fileName
*/
private void copyDbFile(Context context, String fileName) {
InputStream in = null;
FileOutputStream out = null;
String path = "/data/data/" + context.getPackageName() + "/audiofile/";
File file = new File(path + fileName);
//创建文件夹
File filePath = new File(path);
if (!filePath.exists())
filePath.mkdirs();
if (file.exists())
return;
try {
in = context.getAssets().open(fileName); // 从assets目录下复制
out = new FileOutputStream(file);
int length = -1;
byte[] buf = new byte[1024];
while ((length = in.read(buf)) != -1) {
out.write(buf, 0, length);
}
out.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (in != null) in.close();
if (out != null) out.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
播放assets下的音乐
// 打开指定音乐文件,获取assets目录下指定文件的AssetFileDescriptor对象
AssetFileDescriptor afd = am.openFd(music);
mPlayer.reset();
// 使用MediaPlayer加载指定的声音文件。
mPlayer.setDataSource(afd.getFileDescriptor(),
afd.getStartOffset(), afd.getLength());
// 准备声音
mPlayer.prepare();
// 播放
mPlayer.start();