我正在开发一个普通的java库(jar),它包含一些静态文件,我将它放到src/main/resources
。这些静态文件用于执行算法并将处理后的数据返回给用户。
public String getStringFromFile(String fileName) {
String text = "";
try {
ClassLoader classLoader = getClass().getClassLoader();
File file = new File(classLoader.getResource(fileName).getFile());
Scanner scanner = new Scanner(file);
text = scanner.useDelimiter("\\A").next();
scanner.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return text;
}
到目前为止一切顺利。但是,当我尝试在Android项目中使用此库/方法时,我得到:
java.lang.NullPointerException:尝试在空对象引用上调用虚方法'java.lang.String java.net.URL.getFile()'
我希望我的静态资源文件随库一起发布。难道我做错了什么?有什么想法吗?
答案 0 :(得分:0)
确定。我想我已经解决了这个问题。在article之后,我在jar模块的根目录中创建了一个res
目录(与src
目录处于同一级别)并将我的文件放在那里(helloworld.json
)。然后将其添加到build.gradle
:
jar {
into('resourcez') {
from 'res'
}
}
使用这个帮助函数(在jar lib中)和getResourceAsStream()
我得到了资源文件的内容:
public String getModelFromStream(String fileName) {
final String classpath = "resourcez/";
ClassLoader classLoader = DexiModelLoader.class.getClassLoader();
InputStream resourceAsStream = classLoader.getResourceAsStream(fileName);
if (resourceAsStream == null)
resourceAsStream = classLoader.getResourceAsStream(classpath + fileName);
if (resourceAsStream == null)
return "error";
Scanner s = new Scanner(resourceAsStream).useDelimiter("\\A");
return s.hasNext() ? s.next() : "";
}
在此之后,我只需在我的Android应用中拨打getStringFromStream("helloworld.json")
或getStringFromStream("resourcez/helloworld.json")
即可!