在 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")
,瞧瞧!
我正在开发一个普通的 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")
,瞧瞧!