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

Using static resources inside a jar library (to be used in Android)

我正在开发一个普通的 java 库 (jar),其中包含一些我放入 src/main/resources 的静态文件。这些静态文件用于执行算法和 return 向用户处理的数据。

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 项目中使用此 library/method 时,我得到:

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.net.URL.getFile()' on a null object reference

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

好的。我想我已经解决了这个问题。在这个 article 之后,我在我的 jar 模块的根目录中创建了一个 res 目录(与 src 目录处于同一级别)并将我的文件放在那里 (helloworld.json)。然后将其添加到 build.gradle:

jar {
  into('resourcez') {
    from 'res'
  }
}

使用这个辅助函数(在 jar 库中)和 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"),瞧瞧!