Android开发之资源目录assets与res/raw的区别分析

本文实例讲述了Android开发之资源目录assets与res/raw的区别。分享给大家供大家参考,具体如下:

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="1.0" encoding="utf-8"?> <root> <title>Hello XML!</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的资源文件。

希望本文所述对大家Android程序设计有所帮助。

时间: 2024-10-25 10:27:26

Android开发之资源目录assets与res/raw的区别分析的相关文章

Android开发之资源目录assets与res/raw的区别分析_Android

本文实例讲述了Android开发之资源目录assets与res/raw的区别.分享给大家供大家参考,具体如下: assets:用于存放需要打包到应用程序的静态文件,以便部署到设备中.与res/raw不同点在于,ASSETS支持任意深度的子目录.这些文件不会生成任何资源ID,必须使用/assets开始(不包含它)的相对路径名. res:用于存放应用程序的资源(如图标.GUI布局等),将被打包到编译后的Java中.不支持深度子目录 res/menu:存放基于XML的菜单描述: res/raw:存放通

Android开发之资源文件用法实例总结_Android

本文实例总结了Android开发之资源文件用法.分享给大家供大家参考,具体如下: 这里记录在Android开发中经常用到的一些用法 arrays.xml定义数组 例: <resources> <!-- share items --> <string-array name="app_share_items"> <item>新浪微博</item> <item>腾讯微博</item> </string-

Android开发之资源文件用法实例总结

本文实例总结了Android开发之资源文件用法.分享给大家供大家参考,具体如下: 这里记录在Android开发中经常用到的一些用法 arrays.xml定义数组 例: <resources> <!-- share items --> <string-array name="app_share_items"> <item>新浪微博</item> <item>腾讯微博</item> </string-

Android中asset和raw的区别详解_Android

*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目录下可以再建立文件夹 *读取文件资源

Android中asset和raw的区别详解

*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目录下可以再建立文件夹 *读取文件资源

Android开发实现读取assets目录下db文件的方法示例

本文实例讲述了Android开发实现读取assets目录下db文件的方法.分享给大家供大家参考,具体如下: 最近准备打算写一个关于天气预报的app,偶然的机会在一大神的博客上看到了一个获取天气的api,获取天气是通过城市的cityID,项目中准备通过读取weather_city.db数据库来查询cityID,这篇文章写怎么读取assets目录下的db文件,其实方法也挺简单的就是把assets目录下的db文件复制一份到"/data/data/" + packName + "/&

Android开发:程序目录结构详解

  HelloWorld程序的目录结构概述   我们可以在文件夹中看到,HelloWorld程序的目录主要包括:src文件夹.gen文件夹.Android文件夹.assets.res文件夹. AndroidManifest.xml.default.properties.在Eclipse的左侧展开HelloWorld项目,可以看到如下图的目录结构:   开发:程序目录结构详解-">   下面将分节介绍上面的各级目录结构.   1.src文件夹   顾名思义(src, source code)

Android开发笔记--hello world 和目录结构

原文:Android开发笔记--hello world 和目录结构 每接触一个新东西 都有一个hello world的例子. 1.新建项目 2.配置AVD AVD 没有要新建个,如果不能创建 运行SDK Manager更新 3.接着运行就可以了 第一次启动要1分多钟 不要关 4.添加代码 5.接着在运行就OK了   目录结构 1.src - 用于放置源程序 2.gen - 自动生成 R.java 文件,用于引用资源文件(即 res 目录下的数据) 3.assets - 用于放置原始文件,Andr

在Android开发中替换资源图片不起作用的解决方法_Android

现象 在android开发中,经常会需要替换res\drawable中的图片,打开res\layout下的文件预览布局页面发现图片已经被替换,但在模拟器或者真实机器上运行时发现该图片并没有被替换,还是使用的是原来的资源图片. 原因 在开发过程中,由于使用模拟器测试了程序,在首次运行后会将res文件夹下的图片资源文件(如drawable-hdpi.drawable-ldpi和drawable-mdpi)拷贝到bin文件夹下.在替换资源图片后,eclipse并不清楚是否有图片改变,所以会使用原来bi