应使用Resources.openRawResource(R.raw.xxx)获取XML输入流,确保文件名小写且路径正确;动态场景用getIdentifier()检索ID;大文件需openRawResourceFd()获取AssetFileDescriptor;协程中应在IO线程解析并妥善关闭流。
如果您在Android开发中尝试从res/raw目录读取XML文件并获取其输入流,但无法正确获取资源ID或流对象,则可能是由于资源引用方式错误或上下文未正确传递。以下是实现此功能的步骤:
一、使用Resources.openRawResource()方法
该方法通过R.raw资源ID直接打开raw目录下指定XML文件的InputStream,是官方推荐的底层读取方式,适用于已知资源名称且编译时确定的场景。
1、确认XML文件已放入
目录下,例如命名为
config.xml
,且文件名全为小写字母、数字或下划线。
2、在Java代码中调用
,其中
由aapt自动生成,确保无拼写错误。
3、将返回的InputStream包装为XmlPullParser或BufferedReader进行解析,例如:
。
4、使用完毕后必须显式调用
,避免资源泄漏。
二、使用Resources.getIdentifier()动态获取资源ID
当XML文件名在运行时才确定(如从参数传入),无法直接使用R.raw.xxx时,可通过资源名称字符串动态检索ID,再调用openRawResource。
1、调用
,传入文件名(不含扩展名)、资源类型"raw"及当前包名。
2、检查返回值是否大于0,若为0说明未找到对应资源,需验证文件名大小写与路径是否匹配。
3、若ID有效,执行
获取InputStream。
4、
注意:getIdentifier性能较低,不应在循环或高频调用路径中使用
。
Android开发教程与笔记pdf版
Android文件存取与数据库编程知识,文件操作主要是读文件、写文件、读取静态文件等,同时还介绍了创建添加文件内容并保存,打开文件并显示内容;数据库编程方面主要介绍了SQLite数据库的使用、包括创建、删除、打开数据库、非查询SQL操作指令、查询SQL指令-游标Cursors等知识。
下载
三、使用Context.getResources().openRawResourceFd()获取AssetFileDescriptor
该方法返回AssetFileDescriptor,适用于需要随机访问或获取文件长度的场景,例如处理大型XML或需seek操作的情况。
1、调用
获取AssetFileDescriptor对象。
2、调用
获取InputStream,或使用
获取原始文件大小。
3、使用完毕后必须同时关闭InputStream和调用
。
4、
注意:若XML文件被aapt压缩(如未列入res/raw/nodpi/等防压缩目录),getDeclaredLength可能返回-1
。
四、Kotlin协程中安全读取raw XML流
在协程作用域内异步读取可避免主线程阻塞,尤其适用于解析较大数据量的XML文件。
1、在lifecycleScope或viewModelScope中启动IO协程:
。
2、在协程体中调用
获取流。
3、使用
与
逐节点解析,避免一次性加载全部内容到内存。
4、捕获
和
,并在finally块中关闭流。
app/src/main/res/raw/getResources().openRawResource(R.raw.config)R.raw.configXml.newPullParser().setInput(inputStream, "UTF-8")inputStream.close()getResources().getIdentifier("config", "raw", getPackageName())getResources().openRawResource(id)getResources().openRawResourceFd(R.raw.config)afd.createInputStream()afd.getDeclaredLength()afd.close()launch(Dispatchers.IO) { ... }resources.openRawResource(R.raw.config)InputStreamReaderXmlPullParserResources.NotFoundExceptionIOException