zoukankan      html  css  js  c++  java
  • Android中资源文件夹res/raw和assets的使用

    Android中资源文件夹res/raw和assets的使用

     494人阅读 评论(0) 收藏 举报

    *res/raw和assets的相同点:

    1.两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制。


    *res/raw和assets的不同点:
    1.res/raw中的文件会被映射到R.java文件中,访问的时候直接使用资源ID即R.id.filename;assets文件夹下的文件不会被映射到R.java中,访问的时候需要AssetManager类。
    2.res/raw不可以有目录结构,而assets则可以有目录结构,也就是assets目录下可以再建立文件夹

    *读取文件资源:

    1.读取res/raw下的文件资源,通过以下方式获取输入流来进行写操作

    1. InputStream is = getResources().openRawResource(R.id.filename);  

    2.读取assets下的文件资源,通过以下方式获取输入流来进行写操作

    1. AssetManager am = null;  
    2. am = getAssets();  
    3. InputStream is = am.open("filename");  

    补充一下:在未知目录下有哪些文件,该去和获取这些文件的名称并把文件拷贝到目标目录中呢?(用于内置文件但不知道文件名称,需要筛选出想要的文件然后拷贝到目标目录中,推荐内置在assets文件夹中)
    1.res/raw目录:
    通过反射的方式得到R.java里面raw内部类里面所有的资源ID的名称,然后通过名称获取资源ID的值来读取我们想要的文件。(这个方法我没试过,有用过的同学麻烦发一段代码看看)。
    2.assets目录:
    getAssets().list("");来获取assets目录下所有文件夹和文件的名称,再通过这些名称再读取我们想要的文件。

    assets:用于储藏必需打包到利用过程的静态文件,以便安排到装备中。与res/raw不同点在于,ASSETS扶持任意深度的子目录。这些文件不会生成任何资源ID,定然利用/assets开始(不包括它)的相对路径名。

    res:用于储藏利用过程的资源(如图标、GUI格局等),将被打包到编译后的Java中。不扶持深度子目录

    res/menu:储藏基于XML的菜单描写;

    res/raw:储藏通用的文件, 该文件夹内的文件将不会被编译成二进制文件,按原样复制到装备上。

    res/values:储藏字符串、尺寸值。

    res/xml: 储藏通用的XML文件

    三个特异的资源目录 /res/xml /res/raw 和 /assets

    在android开发中,我们离不开资源文件的利用,从drawable到string,再到layout,这些资源都为我们的开发供给了极大的方便,不过我们平时大局部工夫接触的资源目录等闲都是下面这三个。

    /res/drawable

    /res/values

    /res/layout

    但android的资源文件并何止这些,下面就为大家推荐一下另外三个资源目录

    /res/xml

    /res/raw

    /assets

    率先是/res/xml ,这个目录中大家可能偶尔用到过,这里能够用来存储xml款式的文件,并且和其他资源文件一样,这里的资源是会被编译成二进制款式放到最后的安装包里的, 我们也能够穿越R类来拜会这里的文件,并且解析里面的内容,例如我们在这里储藏了一个名为data.xml的文件:

    <?xml version=xilie.org"1.0" encoding="utf-8"?>

    <root>

    <title>Hello XML4008301199.com!</title>

    </root>

    随后,我们就能够穿越资源ID来拜会并解析这个文件了

    XmlResourceParser xml = getResources().getXml(R.xml.data);

    xml.next();

    int eventType = xml.getEventType();

    boolean inTitle = false;

    while(eventType != XmlPullParser.END_DOCUMENT) {

    //到达title节点时符号一下

    if(eventType == XmlPullParser.START_TAG) {

    if(xml.getName().equals("title")) {

    inTitle = true;

    }

    }

    //如过到及格记的节点则取出内容

    if(eventType == XmlPullParser.TEXT && inTitle) {

    ((TextView)findViewById(R.id.txXml)).setText(

    xml.getText()

    );

    }

    xml.next();

    eventType = xml.getEventType();

    }

    在这里,我们用资源类的getXml措施,归来了一个xml解析器,这个解析器的工作原理和SAX措施差不多, 要当心的是,这里的xml文件,最后是会被编译成二进制形式的,万一大家想让文件原样存储的话,那么即将用到下一个目录啦,那即便/res/raw目录

    这个目录的单一差异即便,这里的文件会原封不动的存储到装备上,不会被编译为二进制形式,拜会的措施也是穿越R类,下面是一个例子:

    ((TextView)findViewById(R.id.txRaw)).setText(

    readStream(getResources().openRawResource(R.raw.rawtext))

    );

    private String readStream(InputStream is) {

    try {

    ByteArrayOutputStream bo = new ByteArrayOutputStream();

    int i = is.read();

    while(i !欧珀莱= -1) {

    bo.write(i);

    i = is.read();

    }

    return bo.toString();

    } catch (IOException e) {

    return "";

    }

    }

    这次利用资源类中的措施,openRawResource,归来给我们一个输入流,这么我们就能够任意读取文件中的内容了,例如上面例子中那样,原样输出文本文件中的内容。

    当然,万一你必需更高的自由度,尽量不受android平台的局限,那么/assets这个目录即便你的首选了~

    这个目录中的文件除非不会被编译成二进制形式之外,另外一点即便,拜会措施是穿越文件名,而不是资源ID。并且还有更重要的一点即便,大家能够在这 里任意的发生子目录,而/res目录中的资源文件是不能自行发生子目录的。万一必需这种灵便的资源存储措施,那么就看看下面这个例子:

    AssetManager assets = getAssets();

    ((TextView)findViewById(R.id.txAssets)).setText(

    readStream(assets.open("data.txt"))

    );

    在context上下文中,调用getAssets归来一个AssetManager,然后利用open措施就能够拜会必需的资源了,这里open措施是以assets目录为根的。因而上面这段代码拜会的是assets目录中名为data.txt的资源文件~

    life is a jounery,yes
  • 相关阅读:
    简单多线程创建
    ajax 实现局部页面更新
    基础分页查询解题思路
    cookie实现登录时间记录
    servlet过滤器
    jstl标签 URL智能寻找路径
    taglib遍历foreach循环list集合
    python之内置高阶函数
    python之lambda的使用
    python中的函数
  • 原文地址:https://www.cnblogs.com/CaptainLin/p/3635737.html
Copyright © 2011-2022 走看看