13

这个问题困扰了我一段时间。我必须在我的 java 应用程序中加载几个文件,到目前为止我工作的唯一方法是这样的:

URL hsURL;
if(System.getProperty("os.name").toLowerCase().contains("windows")) {
    hsURL = new URL("file:/" + System.getProperty("user.dir") + "/helpsets/helpset.hs");
}
else {
    hsURL = new URL("file://" + System.getProperty("user.dir") + "/helpsets/helpset.hs");
}

但这是丑陋和可怕的。有一段时间我以为我有这个工作:

hsURL = ClassLoader.getSystemResource("helpsets/helpset.hs");

但这由于某种原因不再起作用(我一定改变了一些东西但没有注意到。它返回 null。

我应该使用 getResource() 而不是 getSystemResource()(如果是,为什么 getSystemResource() 是静态的而不是 getResource())?

我正在使用 eclipse 并且我尝试在构建路径(类路径)中包含该文件夹而不包括它,它似乎没有任何区别。

4

2 回答 2

26

getSystemResource是静态的,因为它将使用静态可用的系统类加载器。( ClassLoader.getSystemClassLoader)

如果您的资源在类路径中可用,我建议使用ClassLoader.getResource()Class.getResource来自适当的类,例如

Foo.class.getResource("/helpsets/helpset.hs");

ClassLoader.getResource是“绝对的”;Class.getResource是相对于类的包,除非你在它前面加上'/'。)

如果这不起作用,请发布您的应用程序是如何根据类路径配置的,以及您的文件在哪里。

编辑:我通常发现 URL 不如 an 有用InputStream,所以我使用getResourceAsStream而不是getResource. YMMV

于 2009-07-13T14:28:07.820 回答
4

你在这里提到了几个不同的东西,所以让我们把它们整理一下。

1) 基于“user.dir”创建一个“file:” URL

“user.dir”属性指的是当前工作目录——当他/她启动应用程序时用户可能在的任何地方。在这里写入的文件很有可能会在两次运行之间消失(因为用户可能从不同的目录运行)。

“user.home”属性是指用户的主目录——在运行之间应该保持不变。

在这两种情况下,使用 File 对象打开文件,不要乱创建“file:” URL。你没有得到任何好处,正如你所看到的,你必须编写杂乱的代码才能访问它。

2) 通过类加载器检索资源

这是为了检索与您的应用程序一起打包的文件——只读文件。如您所见,有多种变体。我更喜欢使用以下内容,因为我假设一个类将要加载与其打包的文件。

InputStream in = this.getClass().getClassLoader().getResourceAsStream(fileName);
于 2009-07-13T14:30:02.967 回答