Android Studio中TSAGeoMag.java的getResourceAsStream()调用异常问题
解决Android中读取WMM.COF文件的FileNotFoundException问题
核心问题分析
你之前的尝试都没命中Android资源打包和访问的规则:
getResourceAsStream()依赖Java类路径,但Android不会把Java文件同目录的非代码文件、res文件夹里的自定义文件打包到类路径中;res目录是用于Android标准资源(布局、图片等)的,这类文件会被系统处理重命名,无法直接通过文件名读取。- 硬编码电脑本地绝对路径完全无效:Android应用运行在独立的沙盒环境中,根本无法访问宿主电脑的文件系统。
- 权限问题:不需要添加任何Manifest权限,因为你要读取的是APP自身打包的资源,不属于外部存储访问范畴。
正确解决方案
1. 放置文件到assets目录
在你的Android Studio项目中,创建src/main/assets目录(和java、res目录同级),将WMM.COF文件放入该目录。Android会自动将assets目录下的文件原封不动打包到APK中。
2. 使用AssetManager读取文件
Android提供AssetManager专门用于读取assets目录下的资源,示例代码如下:
// 在Activity或拥有Context的组件中获取AssetManager AssetManager assetManager = getAssets(); try { InputStream input = assetManager.open("WMM.COF"); // 将input传入TSAGeoMag类进行后续处理 // 比如:TSAGeoMag geoMag = new TSAGeoMag(input); } catch (IOException e) { e.printStackTrace(); throw new FileNotFoundException("WMM.COF not found in assets directory"); }
如果你的TSAGeoMag类是第三方类,没有直接接收Context的方法,建议在调用它的地方先通过AssetManager获取输入流,再将流传入该类的构造方法或初始化方法中。
额外注意事项
- 确保assets目录的创建位置正确:必须是
src/main/assets,否则Android Gradle插件不会识别并打包该目录。 - 检查文件名大小写:Android的assets文件名区分大小写,确保代码中使用的文件名和实际文件完全一致(包括大小写)。
内容的提问来源于stack exchange,提问作者James L.
相关产品推荐
相关产品推荐

