我正在尝试让我的应用程序透明地加载资源(二进制文件):
如果该文件存在于当前目录下,请将其打开 如果没有,请尝试查看当前的JAR文件(如果适用) 如果没有,请尝试查看其他JAR文件。 (这是可选的,我不介意明确指定哪些JAR文件。)
到目前为止,我知道File
打开了一个本地文件,而ClassLoader
对{JAR内容有getResource*
。
是否有一个将两者结合在一起的课程?如果没有,我该如何自己写呢?我应该写一个ClassLoader
来检查本地文件系统吗?使用File
? (我对Java非常不熟悉,甚至不知道返回什么样的好类型。InputStream
?)
由于
P.S。 “文件”是指“路径”,例如“数据/ texture1.png”。
答案 0 :(得分:6)
做#1和#3非常简单。做#2(仅查看当前的JAR)要困难得多,因为它需要你弄清楚你是什么JAR
如果您想首先检查文件系统,否则从类路径加载,它将类似于:
public java.io.InputStream loadByName(String name) {
java.io.File f = new java.io.File(name);
if (f.isFile()) {
return new FileInputStream(f);
} else {
return getClass().getResource(name);
}
}
如果您想首先从同一个JAR文件加载,您需要确定它的位置。查看Determine which JAR file a class is from以获取有关确定要从中加载资源的JAR文件的更多信息。
答案 1 :(得分:3)
如果文件路径位于jar前面的类路径上,URLClassLoader应该能够加载并尝试文件路径。
关于你的意见:
答案 2 :(得分:1)
当前jar文件和当前目录不是JVM中的概念,就像运行shell脚本时一样。您需要指定一个目录来用于加载您感兴趣的文件,例如在执行JVM时使用系统属性:
java -Ddirectory.to.scan=/home/aib
然后检索此属性:
String dir = System.getProperty("directory.to.scan");
现在,在谈论JAR文件时,ClassLoader会加载在启动JVM时在类路径上显式指定的所有JAR文件。您可以通过以下方式获取特定类的ClassLoader:
InputStream is = <Your class>.class.getClassLoader().getResourceAsStream("binary file");
请注意,搜索当前类加载器加载的任何jar文件。