assets raw 目录简介

assets核心特性:不会被编译成二进制,支持子目录(可以分类,这是相对raw目录最大的好处),通过文件名访问,调用getAssets通过AssetManager访问
res/raw核心特性:会被映射到【R.java】文件中,通过资源的ID访问(访问方便,这是相对assets目录最大的好处),不会被编译成二进制,不支持子目录

assets 文件夹是存放不进行编译加工的原生文件,即该文件夹里面的文件不会像 xml、 java 文件那样会被预编译。常用来存放一些图片、音频、html、js、css等文件。
如果你需要更灵活、自由的控制资源文件,那么【/assets】目录就是你的首选了。

assets 特点:
  • 目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制。这一点和【res/raw】目录下的文件一致
  • 目录下的文件是通过完整文件名访问的(assets目录为根目录),访问的时候需要使用AssetManager管理类。而res目录下的资源文件都会被映射到【R.java】文件中,并且都是通过资源的ID访问的,如:R.raw.name,R.drawable.name,R.color.name等。这是和【res/raw】最大的区别。
  • 可以任意的建立子目录,而res目录中的资源文件是不能自行建立子目录的


关于存放文件的大小限制问题:
网上传言,assets和raw目录中不可以放超过1M(4M)的文件,否则会出问题。
但是实际上,我在assets和raw放一个10M+的音频用MediaPlayer播放时,都没有任何问题(可以完整播放)。
相反,我在assets和raw放一个1M-的音频用SoundPool播放时,都不能完全播放(只能播放十几秒,后面的全部丢失了)。
所以,我觉得不是assets和raw目录对文件大小做了限制,是你读取文件的API对流的大小做了限制从而导致文件不能被全部读取。

assets raw 目录下文件的访问示例

对于assets,这里访问的文件"data.txt"是"bqt"目录下的文件,而"bqt"目录是以assets为根目录的。
  1. InputStream in = getResources().getAssets().open("bqt/data.txt");
  2. InputStream in2 = getResources().openRawResource(R.raw.data);
  3. AssetFileDescriptor afd = getResources().getAssets().openFd("bqt/data.txt");
  4. AssetFileDescriptor afd2 = getResources().openRawResourceFd(R.raw.data);

AssetManager 简介【重要】

Provides access to an application's raw asset files; see Resources for the way most applications will want to retrieve their resource data. This class presents a lower-level API that allows you to open and read raw files that have been bundled with the application as a simple stream of bytes.
提供对应用程序的raw asset(原始资源)文件的访问;请参阅参考资料,了解大多数应用程序将要检索其资源数据的方式。 此类提供了一个较低级别的API,允许您打开并读取与应用程序绑定的、作为简单的字节流的原始文件。
  1. public final class AssetManager extends Object implements AutoCloseable

Constants:Mode for open(String, int)
  • int  ACCESS_BUFFER:Attempt to load contents into memory, for fast small reads. 尝试将内容加载到内存中,以实现快速读取。
  • int  ACCESS_RANDOM:Read chunks, and seek forward and backward. 读取块,向前和向后寻找。
  • int  ACCESS_STREAMING:Read sequentially, with an occasional forward seek.  顺序读取,偶尔前向搜索。
  • int  ACCESS_UNKNOWN:no specific information about how data will be accessed. 没有关于如何访问数据的具体信息。

open methods
  • final InputStream  open(String fileName)  Open an asset using ACCESS_STREAMING mode.
    • This provides access to files that have been bundled with an application as assets -- that is, files placed in to the "assets" directory. 这提供了将作为assets捆绑到应用程序的文件(即放置在“assets”目录中的文件)的访问方式。
    • String fileName: The name of the asset to open. This name can be hierarchical(分层的,按等级划分的;即:带目录). i.e., "docs/home.html".
  • final InputStream  open(String fileName, int accessMode)  Open an asset using an explicit access mode, returning an InputStream to read its contents.
  • final AssetFileDescriptor  openFd(String fileName)
  • final AssetFileDescriptor  openNonAssetFd(String fileName)
  • final AssetFileDescriptor  openNonAssetFd(int cookie, String fileName)  int cookie: Identifier(识别符) of the package to be opened.
  • final XmlResourceParser  openXmlResourceParser(String fileName)  Retrieve a parser for a compiled XML file.
  • final XmlResourceParser  openXmlResourceParser(int cookie, String fileName) Retrieve a parser for a compiled XML file.

other methods
  • void  close()  Close this asset manager.
  • final String[]  getLocales()  Get the locales that this asset manager contains data for.
    • On SDK 21 (Android 5.0: Lollipop) and above, Locale strings are valid BCP-47 language tags and can be parsed using forLanguageTag(String). 在SDK 21及以上版本中,区域设置字符串是有效的BCP-47语言标签,可以使用forLanguageTag(String)进行解析。
    • On SDK 20 (Android 4.4W: Kitkat for watches) and below, locale strings are of the form ll_CC where ll is a two letter language code, and CC is a two letter country code. 在SDK 20及以下版本中,语言环境字符串的形式为ll_CC,其中ll是双字母语言代码,CC是两个字母的国家代码。
  • final String[]  list(String path)  Return a String array of all the assets at the given path.
    • Returns:String[] Array of strings, one for each asset. These file names are relative to 'path'. You can open the file by concatenating 'path' and a name in the returned string (via File) and passing that to open().
    • 返回:String []字符串数组,每个asset一个。 这些文件名与“路径”相关。 您可以通过连接“path”和返回的字符串中的名称(通过File)打开文件,并将其传递给open()。

内部类:AssetManager.AssetInputStream
  1. public final class AssetManager.AssetInputStream extends InputStream 
2017-7-6

assets raw 资源 AssetManager的更多相关文章

  1. Android的xml/assets/raw资源使用具体解释

    一.assets/xml/raw资源介绍 1.assets资源文件夹:assets文件夹下存放的资源代表应用无法直接訪问的原生资源,这些文件将原封不动的存储到设备上,不会被编译为二进制形式,訪问方式是 ...

  2. Android 的assets文件资源与raw文件资源读取

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/zpf8861/article/details/34504183   res/raw和assets的同 ...

  3. assets与res/raw资源目录的区别

    1.简介 assets和res/raw工程目录下都可以放一些小于1M的文件(2.3版本以前要求,否则将不能读出数据.),这些文件将被原样打包到APK中应用使用. 2.不同 assets目录下的文件将原 ...

  4. Android ndk下用AssetManager读取assets的资源

    转自:http://www.cppblog.com/johndragon/archive/2012/12/28/196754.html 在使用 cocos2dx 在 Android 上进行游戏开发时, ...

  5. Android中的asserts和res/raw资源目录

    1.assets目录 assets目录下称为原生文件,无法通过R资源清单类访问,这类文件在被打包成apk文件时是不会进行压缩的: (1)使用方法 AssetManager assets = this. ...

  6. Android 读取Assets中资源

    //读取文件 private static String getFromAssets(Context context, String fileName) { String result = " ...

  7. 读书笔记 effective c++ Item 15 在资源管理类中提供对原生(raw)资源的访问

    1.为什么需要访问资源管理类中的原生资源  资源管理类是很奇妙的.它们是防止资源泄漏的堡垒,没有资源泄漏发生是设计良好的系统的一个基本特征.在一个完美的世界中,你需要依赖这样的类来同资源进行交互,绝不 ...

  8. Android MediaPlayer播放raw资源封装类

    import android.content.Context; import android.media.MediaPlayer; import xxxx.R; public class MediaU ...

  9. 为什么angular library的build不能将assets静态资源打包进去(转)

    Versions Angular CLI: 6.0.7 Node: 9.3.0 OS: darwin x64 Angular: 6.0.3 ... animations, common, compil ...

随机推荐

  1. Framework类库(FCL)简介

    Framework类库(Framework Class Library,FCL)是一组DLL程序集的统称,其中含有数千个类型定义,每个类型都公开了一些功能 部分常规的FCL命名空间 命名空间 内容说明 ...

  2. with上下文管理器

    术语 要使用 with 语句,首先要明白上下文管理器这一概念.有了上下文管理器,with 语句才能工作. 下面是一组与上下文管理器和with 语句有关的概念. 上下文管理协议(Context Mana ...

  3. 面向对象设计原则 依赖倒置原则(Dependency Inversion Principle)

    依赖倒置原则(Dependence Inversion Principle)是程序要依赖于抽象接口,不要依赖于具体实现. 简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块 ...

  4. 洛谷.4238.[模板]多项式求逆(NTT)

    题目链接 设多项式\(f(x)\)在模\(x^n\)下的逆元为\(g(x)\) \[f(x)g(x)\equiv 1\ (mod\ x^n)\] \[f(x)g(x)-1\equiv 0\ (mod\ ...

  5. 【NOIP2014】联合权值 树上dp

    题目描述 Description 无向连通图G 有n 个点,n - 1 条边.点从1 到n 依次编号,编号为 i 的点的权值为W i   ,每条边的长度均为1 .图上两点( u ,  v ) 的距离定 ...

  6. Codeforces Round #293 (Div. 2) B. Tanya and Postcard 水题

    B. Tanya and Postcard time limit per test 2 seconds memory limit per test 256 megabytes input standa ...

  7. Google Code Jam 2009 Qualification Round Problem B. Watersheds

    https://code.google.com/codejam/contest/90101/dashboard#s=p1 Problem Geologists sometimes divide an ...

  8. Git_从远程库克隆

    上次我们讲了先有本地库,后有远程库的时候,如何关联远程库. 现在,假设我们从零开发,那么最好的方式是先创建远程库,然后,从远程库克隆. 首先,登陆GitHub,创建一个新的仓库,名字叫gitskill ...

  9. Maven使用(转)

    说明:文章转自http://www.cnblogs.com/JeffreySun/archive/2013/03/14/2960573.html 创建project 先去官方网站下载一个最新版本htt ...

  10. 丢失或损坏NDF文件如何附加数据库

    在论坛看到有人遇到 NDF文件丢失并且没有备份,所以无法成功附加数据库.在网上也看到过很多回答是如果没有NDF就无法附加成功. 其实我自己测试下来即使没有NDF也是可以成功附加的.但是有条件,丢失的N ...