资源文件拷贝的三种方式
- 类加载器(类路径)
- 用
Classloader.getResourceAsStream()来读取类路径中的资源,然后用FileOutputStream写入到自己的应用中(sdk开发的时候经常用这种方式)。 - 这种方式必须要将数据库
address.db放到src目录下,这样编译后就会直接将address.db生成到bin/classes目录中,会在类路径下,
所以可以使用Classloader进行加载.
- 用
InputStream is = getClassLoader().getResourceAsStream("address.db");
File file = new File(/data/data/包名/files/address.db);
FileOutputStream fos = new FileOutputStream(file);
- Raw目录
将资源文件放到res-raw下, 然后用getResources.openRawResource(R.raw.addresss);(要求资源最好不超过1M,因为系统会编译res目录) -
Assets目录
将资源文件放到Assets目录中。然后用mContext.getAssets().open("address.db");来读取该资源(Assets目录中的文件不会被编译,会原封不动的打包到apk中,
所以一般用来存放比较大的资源文件)
注意:上面这是在Eclipse中的使用方式,因为在Eclipse中assets目录是在res下,但是在Android Studio中如果这样使用会报FileNotFoundException,为什么呢?
文件名字没错,而且明明是在assets目录中的,这是因为在Studio中assets文件夹的目录层级发生了变化,直接在module下,与src目录平级了?该如何修改呢?
答案就是把assets目录移src/main下面就可以了?为什么呢?因为我们打开app.impl可以看到<option name="ASSETS_FOLDER_RELATIVE_PATH" value="/src/main/assets" />。
所以把assets移到src/main/下就可以了。
那Raw和Assets两者有什么区别呢?
- 两者目录下的文件在打包后会原封不动的保存在
apk包中,不会被编译成二进制。 - 在读取这两个资源文件夹中的文件时会有一定的限制,即单个文件大小不能超过
1M,如果读取超过1M的文件会报Data exceeds UNCOMPRESS_DATA_MAX (1314625 vs 1048576)的IOException。 raw中的文件会被映射到R文件中,访问的时候直接使用资源ID;assets文件夹下的文件不会被映射到R文件中。raw不可以有目录结构,而assets则可以有目录结构,也就是assets目录下可以再建立文件夹。
极客教程