资源文件拷贝的三种方式
- 类加载器(类路径)
- 用
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
目录下可以再建立文件夹。