Skip to content

Latest commit

 

History

History
38 lines (28 loc) · 2.45 KB

资源文件拷贝的三种方式.md

File metadata and controls

38 lines (28 loc) · 2.45 KB

资源文件拷贝的三种方式

  • 类加载器(类路径)

    • 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目录下可以再建立文件夹。