android 读写文件 简书,Android中文件的读写(二)----assets和raw下的资源文件

ff8bc3fe76bc

介绍

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

本文参考:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值