背景
当一个Android app第一次安装到手机上并启动时,需要初始化一些数据,其中包括程序运行时所必须依赖的文件、数据库等,例如电话号码归属地数据库等,因此,可以在程序开发过程中可以将一些必要的数据或文件放在Assests(该文件夹下的内容不会被编译)目录下,这样做的好处是无需程序首次运行时还要联网下载这些数据;当然有利必有弊,其缺点apk大小相应的会增加。
思路
方法一:在Assests文件夹下放一个config.txt的文件。其中config文件内容为Assests目录下文件的名称及其路径(相对于Assests文件夹的路径),然后读取config文件里面的内容,然后根据文件的路径使用for循环copy指定目录即可
方法二: 直接便利Assests文件夹,然后使用正则表达式匹配出想要的文件名,存放在一个集合中,按照方法一完成后续工作。
说明:方法一主要针对Assests文件夹下目录结构很多时。方法二则为懒人做法,对于所有文件都在Assests文件夹下而无结构可分的情况下较为便利
事例代码:
匹配Assests文件夹下所有 xx.jpg格式的图片并放到sd卡的一个目录中:
ArrayList<String> fileNames = new ArrayList<String>();
Pattern pattern = Pattern.compile("[a-zA-Z]+(\\.jpg)$");
try {
String[] list = getAssets().list("");
for (String fileName : list) {
Matcher matcher = pattern.matcher(fileName);
if (matcher.matches()) {
fileNames.add(fileName);
}
}
AssetManager manager = getAssets();
InputStream inputStream;
FileOutputStream fileOutputStream;
File file;
for (String name : fileNames) {
file = new File(FileUtils.getRecentChatPath(), name);
if (file.exists()) {
continue;
}
inputStream = manager.open(name);
fileOutputStream = new FileOutputStream(file);
byte[] buffer = new byte[1024];
int len = 0;
while ((len = inputStream.read(buffer)) != -1) {
fileOutputStream.write(buffer, 0, len);
}
fileOutputStream.flush();
fileOutputStream.close();
inputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}