AssetManager.open() 报 IOException 主因是路径错误或 BOM 问题:必须用纯相对路径(如"xml/config.xml"),禁用"/assets/"前缀;XML 文件需为 UTF-8 without BOM,且区分大小写。

AssetManager.open() 报 IOException: android.content.res.AssetManager$AssetInputStream
这不是文件不存在,而是路径写错了——AssetManager 的 open() 方法只接受相对于 assets/ 根目录的纯路径,不支持 /assets/xxx.xml 或 ./xxx.xml 这类带前缀或相对符号的写法。
- 正确写法:
"config.xml"(假设文件在assets/config.xml) - 错误写法:
"/assets/config.xml"、"assets/config.xml"、"./config.xml" - 路径区分大小写,Android 设备上
Config.xml≠config.xml - 如果 XML 放在子目录(如
assets/xml/config.xml),必须写成"xml/config.xml",不能漏掉xml/
用 XmlPullParser 解析 assets XML 时卡在 nextTag()
常见于没调 setInput() 就直接 parse,或者输入流未重置。AssetInputStream 是一次性流,读完就 EOF,重复调 open() 会新开一个流,但若你缓存了流对象并反复用它 parse,就会失败。
- 每次解析前必须重新
assetManager.open("xxx.xml")拿新流 -
XmlPullParser.setInput(inputStream, "UTF-8")编码名必须显式传,不能为null,否则某些机型(尤其低版本)会抛NullPointerException - 别用
BufferedInputStream包一层再塞给 parser——XmlPullParser内部已做缓冲,反而可能干扰行号定位和异常提示
build.gradle 中 assets 资源没打进 APK,open() 直接 FileNotFoundException
Gradle 默认只打包 src/main/assets/ 下的文件,如果你把 XML 放在 src/debug/assets/ 或 src/release/assets/,且当前构建变体不是对应 flavor,那它根本不会进 APK。
- 确认文件物理位置是
src/main/assets/xxx.xml - 执行
./gradlew assembleDebug后,解压app/build/outputs/apk/debug/app-debug.apk,用zipinfo查看 assets 目录是否存在该文件 - 如果用了
sourceSets自定义 assets 路径,确保assets.srcDirs包含正确路径,例如:assets.srcDirs = ["src/main/assets", "src/shared/assets"]
XML 中含 UTF-8 BOM 或非法控制字符导致解析失败
Android 的 XmlPullParser 对 BOM(Byte Order Mark)容忍度低,特别是 EF BB BF 开头的 UTF-8 文件,在部分 API 级别会直接报 XmlPullParserException: Unexpected token。
- 用
xxd -l 8 your.xml或 VS Code 的 Hex Editor 插件检查开头三字节是否为ef bb bf - 保存 XML 时选 “UTF-8 without BOM”(Notepad++、VS Code 均可设置)
- 避免在 XML 值里手动粘贴 Word 或网页复制的内容——容易混入零宽空格(
U+200B)、软连字符(U+00AD)等不可见字符










