付费下载
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】Android开发实践:拷贝assets到sdcard
我们知道,Android工程目录下有一个assets文件夹,它到底有什么作用呢?网上关于assets文件夹与res/raw文件夹的区别的讨论挺多的,也没有一个统一官方的结论,到底何时用assets,何时用res/raw,这里我也来谈谈我的理解和总结。我认为raw目录毕竟是存放于res目录下的,因此,应该更多地把raw目录看作是系统资源文件的一部分。res/raw目录下的文件会被映射到R.java文件中,访问的时候可以直接使用资源ID,例如:R.id.filename,并且很多Android的API都支持传入这样的id参数,因此我的结论是:以“资源”的形式在Android程序中引用的文件,可以放到res/raw目录下,如声音片段,html文件,图片文件等等。而assets该目录可以有多层次的目录结构,里面的文件不会被映射到R.java中,访问的时候需要使用AssetManager类,一般以文件流(InputStream)的形式来打开和访问,因此,我的结论是:该目录下一般存放一些“非资源”类型的文件,多半是自定义或者结构复杂的文件,比如:游戏/应用的初始配置文件、数据库文件、字典数据、字体文件等等。其实,在实际的应用中,assets目录的文件,大都是作为应用的初始化配置,在应用初始安装启动后,拷贝到系统的sdcard中存储的。Android系统在sdcard上为每一个应用分配了存储路径:/sdcard/Android/data/$(应用的包路径),该路径可以通过context.getExternalFilesDir得到,一般应用卸载的时候,该目录也会随之被删除。关于assets目录与res/raw目录的区别就介绍到这,下面我给出一份我封装好的类,提供将assets目录下的文件按目录结构拷贝到sdcard的实现。package
com.ticktick.testassets;
import
java.io.BufferedReader;
import
java.io.File;
import
java.io.FileOutputStream;
import
java.io.IOException;
import
java.io.InputStream;
import
java.io.InputStreamReader;
import
java.io.OutputStream;
import
java.util.ArrayList;
import
java.util.List;
import
android.content.Context;
import
android.content.res.AssetManager;
/**
*
AssetCopyer类
*
实现将assets下的文件按目录结构拷贝到sdcard中
*
*
@author
ticktick
*
lujun.hust@
*/
public
class
AssetCopyer
{
private
static
final
String
ASSET_LIST_FILENAME
=
"assets.lst";
private
final
Context
mContext;
private
final
AssetManager
mAssetManager;
private
File
mAppDirectory;
public
AssetCopyer(
Context
context
)
{
mContext
=
context;
mAssetManager
=
context.getAssets();
}
/**
*
将assets目录下指定的文件拷贝到sdcard中
*
@return
是否拷贝成功,true
成功;false
失败
*
@throws
IOException
*/
public
boolean
copy()
throws
IOException
{
List<String>
srcFiles
=
new
ArrayList<String>();
//获取系统在SDCard中为app分配的目录,eg:/sdcard/Android/data/$(app's
package)
//该目录存放app相关的各种文件(如cache,配置文件等),unstall
app后该目录也会随之删除
mAppDirectory
=
mContext.getExternalFilesDir(null);
if
(null
==
mAppDirectory)
{
return
false;
}
//读取assets/$(subDirectory)目录下的assets.lst文件,得到需要copy的文件列表
List<String>
assets
=
getAssetsList();
for(
String
asset
:
assets
)
{
//如果不存在,则添加到copy列表
if(
!
new
File(mAppDirectory,asset).exists()
)
{
srcFiles.add(asset);
}
}
//依次拷贝到App的安装目录下
for(
String
file
:
srcFiles
)
{
copy(file);
}
return
true;
}
/**
*
获取需要拷贝的文件列表(记录在assets/assets.lst文件中)
*
@return
文件列表
*
@throws
IOException
*/
protected
List<String>
getAssetsList()
throws
IOException
{
List<String>
files
=
new
ArrayList<String>();
InputStream
listFile
=
mAssetManager.open(new
File(ASSET_LIST_FILENAME).getPath());
BufferedReader
br
=
new
BufferedReader(new
InputStreamReader(listFile));
String
path;
while
(null
!=
(path
=
br.readLine()))
{
files.add(path);
}
return
files;
}
/**
*
执行拷贝任务
*
@param
asset
需要拷贝的assets文件路径
*
@return
拷贝成功后的目标文件句柄
*
@throws
IOException
*/
protected
File
copy(
String
asset
)
throws
IOException
{
InputStream
source
=
mAssetManager.open(new
File(asset).getPath());
File
destinationFile
=
new
File(mAppDirectory,
asset);
destinationFile.getParentFile().mkdirs();
OutputStream
destination
=
new
FileOutputStream(destinationFile);
byte[]
buffer
=
new
byte[1024];
int
nread;
while
((nread
=
source.read(buffer))
!=
-1)
{
if
(nread
==
0)
{
nread
=
source.read();
if
(nread
<
0)
break;
destination.write(nread);
continue;
}
destination.write(buffer,
0,
nread);
}
destination.close();
return
destinationFile;
}
}注意,本拷贝代码的实现要求assets目录下必须有一个assets.lst文件,列出需要被拷贝到sdcard的文件列表。附件中是示例工程的代码,工程结构如图所示:
其中,assets.lst文件内容如下:
map/china.txt
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年生成式AI在建筑方案设计中的创新应用
- 2026年热力管网补偿器安装与保温质量控制方案
- 2021-2022学年浙江省宁波市余姚市九年级(上)期中数学试卷-带答案详解
- 2023-2024学年人教版小学数学五年级下册第四单元《分数的意义和性质》 单元测试(含答案解析)
- IQC、IPQC、FQC、OQC……这些基础术语如何区分与运用
- 禽类产品购买服务协议书
- 外出行医协议书
- 专题活动策划方案特点(3篇)
- 照明工厂活动策划方案(3篇)
- 策划活动方案ai生成(3篇)
- GB/T 19022-2003测量管理体系测量过程和测量设备的要求
- (完整版)英语常用词素表
- 5循证医学基础证据 课件
- 赣美版小学五年级美术下册全套课件
- 华东理工大学分析化学第2章-分析化学中的数据处理及评价课件
- 电厂工程热工专业施工方案
- DB32T 4111-2021 预应力混凝土实心方桩基础技术规程
- 华中农业大学(横向项目研究)技术合同参考样本
- FAI(样品)检验报告(样式)
- 2022年云南省特岗教师招聘考试《初中化学教师专业课考试大纲》
- 医疗器械培训计划年
评论
0/150
提交评论