Android 资源文件拷贝的三种方式

资源文件拷贝的三种方式

  • 类加载器(类路径)
    • 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中的使用方式,因为在Eclipseassets目录是在res下,但是在Android Studio中如果这样使用会报FileNotFoundException,为什么呢?
    文件名字没错,而且明明是在assets目录中的,这是因为在Studioassets文件夹的目录层级发生了变化,直接在module下,与src目录平级了?该如何修改呢?
    答案就是把assets目录移src/main下面就可以了?为什么呢?因为我们打开app.impl可以看到<option name="ASSETS_FOLDER_RELATIVE_PATH" value="/src/main/assets" />
    所以把assets移到src/main/下就可以了。

RawAssets两者有什么区别呢?

  • 两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制。
  • 在读取这两个资源文件夹中的文件时会有一定的限制,即单个文件大小不能超过1M ,如果读取超过1M的文件会报Data exceeds UNCOMPRESS_DATA_MAX (1314625 vs 1048576)IOException
  • raw中的文件会被映射到R文件中,访问的时候直接使用资源IDassets文件夹下的文件不会被映射到R文件中。
  • raw不可以有目录结构,而assets则可以有目录结构,也就是assets目录下可以再建立文件夹。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程