我有一个android应用程序,它有一个我创建的依赖库,在build.gradle中通过compile {artifact_name}引用。库需要访问其资源dir(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”。
但是,如果我在库本身的客户端类中运行它,就可以找到它。
答案 0 :(得分:1)
更新(我有更多时间给出完整答案)
在您的情况下,帮助者类ClassLoader
可以访问您的文件(这就是您在"jar:file:/data/app/com.my.app/base.apk!/myfile.json"
实例中获得FileReader
的原因。)
但是FileReader
不了解完全限定的URL
s(只有URL
的方案file:
或没有任何方案,但你有外部方案{ {1}} - 可从jar文件访问的文件。)
要在这种情况下阅读数据,您应该使用InputStreamReader
和Class.getResourceAsStream
的组合:
jar:
PS 在您不需要直接访问
我发现了一些有用的信息:ClassLoader cl = helper.class.getClassLoader();
InputStream is = cl.getResourceAsStream("myfile.json");
Reader r = new InputStreamReader(is);
的常见情况下,ClassLoader
会自行访问它。只有极少数情况下才能使用Class
访问权限,在这种情况下,您应该非常清楚ClassLoader
es和Class
。ClassLoader
es方法(Class
和getResource
)仅检查同一个包中的文件,而getResourceAsStream
方法检查(另外)根路径(因为我记得他们中的一些人在这两个地方进行了检查,今天我检查了那个班级没有检查jar文件的根目录。)