- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 android 应用程序,它有一个我创建的依赖库,通过编译 {artifact_name} 在 build.gradle 中引用。该库需要访问其资源目录(src/main/resources)中的资源文件。这是我想要完成但无法完成的:
URL url = helper.class.getClassLoader().getResource("myfile.json");
FileReader fr = new FileReader(url.getPath());
myfile.json 位于我的库的 src/main/java/resources 中。这导致应用程序崩溃,并在尝试创建 FileReader 时提示“jar:file:/data/app/com.my.app/base.apk!/myfile.json”未找到。
但是,如果我在库本身的客户端类中运行它,则可以找到它。
最佳答案
已更新(我还有更多时间给出完整答案)
在你的情况下,辅助类的 ClassLoader
可以访问你的文件(这就是为什么你得到 "jar:file:/data/app/com.my.app/base. apk!/myfile.json"
在你的 FileReader
实例中)。
但 FileReader
不理解完全限定的 URL
(仅 URL
具有方案 file:
或没有任何方案,但您有外部方案 jar:
- 可从 jar 文件访问的文件)。
在这种情况下要读取数据,您应该1使用InputStreamReader
的组合和 Class.getResourceAsStream
:
ClassLoader cl = helper.class.getClassLoader();
InputStream is = cl.getResourceAsStream("myfile.json");
Reader r = new InputStreamReader(is);
PS 在通常情况下,您不需要直接访问 我发现了一些有用的信息:ClassLoader
- Class
将自行访问它。只有极少数情况下才应该使用对 ClassLoader
的访问,在这种情况下,您应该非常清楚地理解 Class
和 ClassLoader
。Class
es 方法(getResource
和 getResourceAsStream
)仅在同一包中检查文件,而 ClassLoader
的方法检查(另外)在根路径(因为我记得其中一些在两个地方都检查,今天我检查了类不检查 jar 文件的根)。
关于java - 如何从依赖的 jar 访问资源文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34802571/
我是一名优秀的程序员,十分优秀!