打开文件;首先尝试文件系统,然后尝试JAR

时间:2010-09-29 16:32:54

标签: java jar classpath classloader

我正在尝试让我的应用程序透明地加载资源(二进制文件):

如果该文件存在于当前目录下,请将其打开 如果没有,请尝试查看当前的JAR文件(如果适用) 如果没有,请尝试查看其他JAR文件。 (这是可选的,我不介意明确指定哪些J​​AR文件。)

到目前为止,我知道File打开了一个本地文件,而ClassLoader对{JAR内容有getResource*

是否有一个将两者结合在一起的课程?如果没有,我该如何自己写呢?我应该写一个ClassLoader来检查本地文件系统吗?使用File? (我对Java非常不熟悉,甚至不知道返回什么样的好类型。InputStream?)

由于

P.S。 “文件”是指“路径”,例如“数据/ texture1.png”。

3 个答案:

答案 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文件。