介绍
assets目录(app_ame\module_name\src\main\assets)和raw目录(app_ame\module_name\src\main\res\raw)下的资源只能读取,不能写入,资源文件在打包后会原封不动的保存在apk包中,不会被编译成二进制文件,可以存放音频,视频文件,文件的大小被限制在1M以下,推荐放入assets目录下。
二者的不同点在于:
res/raw中的文件会被映射到R.java文件中,访问的时候直接使用资源ID即R.raw.filename;assets文件夹下的文件不会被映射到R.java中,访问的时候需要AssetManager类。另外res/raw不可以有目录结构,而assets则可以有目录结构(在其目录下可以再建文件夹)
读取的方式
1.读取res/raw下的文件资源,通过以下方式获取输入流:
InputStream is = getResources().openRawResource(R.raw.filename);
2.读取assets下的文件资源,通过以下方式获取输入流:
InputStream is = getResources().getAssets().open("filename");
assets详解
AssetManager类
提供对应用程序的原始资源文件进行访问,这个类提供了一个低级别的API,它允许你以简单的字节流的形式打开和读取和应用程序绑定在一起的原始资源文件。通过getAssets()方法获取AssetManager对象。
AssetManager类常用方法:
final String[] list(String path) //返回指定路径下的所有文件及目录名。
final InputStream open(String fileName) //使用 ACCESS_STREAMING模式打开assets下的指定文件。.
final InputStream open(String fileName, int accessMode) //使用显示的访问模式打开assets下的指定文件.
AssetFileDescriptor
在AssetManager中一项的文件描述符。这提供你自己打开的FileDescriptor可用于读取的数据,以及在文件中的偏移量和长度的该项的数据。可以通过AssetManager的openFd()的方法获取asset目录下指定文件的AssetFileDescriptor对象。
AssetFileDescriptor常用方法:
FileInputStream createInputStream() //为asset创建并返回一个自动关闭的输入流。
FileOutputStream createOutputStream() //为asset创建并返回一个自动关闭的输出流。
FileDescriptor getFileDescriptor() //返回可用于读取文件中的数据的FileDescriptor对象。
long getLength() //返回该asset中项的数据的总字节数。
long getStartOffset() //返回asset中项的数据字节开始偏移。
assets使用案例
将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();
END
本文参考: