在jar库中使用静态资源(在Android中使用)

时间:2017-06-06 19:20:17

标签: java android jar resources classpath

我正在开发一个普通的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()'

我希望我的静态资源文件随库一起发布。难道我做错了什么?有什么想法吗?

1 个答案:

答案 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")即可!