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

发布于 2024-09-25 09:49:18 字数 471 浏览 5 评论 0原文

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

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

到目前为止,我知道打开本地文件的 File 和具有 getResource 的 ClassLoader * 表示 JAR 内容。

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

谢谢

(我对 我所说的“文件”是指“路径”,例如“data/texture1.png”。

I'm trying to have my application load a resource (binary file) transparently:

If the file exists under the current directory, open it.
If not, try looking in the current JAR file if applicable.
If not, try looking in other JAR files. (This is optional and I don't mind explicitly specifying which JAR files.)

So far I know of File which opens a local file and ClassLoader which has getResource* for JAR contents.

Is there a class which combines the two? If not, how should I go about writing it myself? Should I write a ClassLoader which also checks the local filesystem? Using File? (I'm very unfamiliar with Java and don't even know what's a good type to return. InputStream?)

Thanks

P.S. By "file" I mean "path", e.g. "data/texture1.png".

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

把昨日还给我 2024-10-02 09:49:18

执行#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 文件中,您需要找出它在哪里。查看确定类来自哪个 JAR 文件了解更多信息有关确定要从中加载资源的 JAR 文件的信息。

Doing #1 and #3 is pretty easy. Doing #2 (just looking in the current JAR only) is much harder as it requires you figuring out what JAR you

If you wanted to check the filesystem first, otherwise load from classpath, it would be something like:

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);
  }
}

If you want to prefer loading from the same JAR file first, you will need to figure out where it is. Check out Determine which JAR file a class is from for more info on figuring out the JAR file you want to load the resource from.

土豪我们做朋友吧 2024-10-02 09:49:18

URLClassLoader 应该能够加载两者如果文件路径位于 jar 前面的类路径上,则首先尝试文件路径。


关于您的评论:

A URLClassLoader should be able to load both and try the file path first if the file path is on the class path ahead of the jar.


Regarding your comments:

呆橘 2024-10-02 09:49:18

当前 jar 文件和当前目录不是 JVM 中的概念,就像运行 shell 脚本时那样。您需要指定一个用于加载您感兴趣的文件的目录,例如在执行 JVM 时使用系统属性:

java -Ddirectory.to.scan=/home/aib

然后检索此属性:

String dir = System.getProperty("directory.to.scan");

现在,当谈论 JAR 文件时,所有在上明确指定的 JAR 文件启动 JVM 时的类路径由 ClassLoader 加载。您可以通过以下方式获取特定类的 ClassLoader:

InputStream is = <Your class>.class.getClassLoader().getResourceAsStream("binary file");

请注意,将搜索当前类加载器加载的任何 jar 文件。

Current jar file and current directory are not concepts in the JVM like they are when you're running a shell script. You would need to specify a directory to be used for loading the files that you're interested in, such as with a system property while executing the JVM:

java -Ddirectory.to.scan=/home/aib

Then retrieve this property:

String dir = System.getProperty("directory.to.scan");

Now when talking about JAR files, all JAR files specified explicitly on the classpath when you start the JVM are loaded by the ClassLoader. You can get the ClassLoader of a specific class by:

InputStream is = <Your class>.class.getClassLoader().getResourceAsStream("binary file");

Note that any jar file loaded by the current class loader is searched.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文