使用ClassLoader加载文件

时间:2009-07-13 14:22:49

标签: java file classloader

这个问题一直困扰着我。我必须在我的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,我尝试在构建路径(classpath)中包含该文件夹而不包括它,它似乎没有什么区别。

2 个答案:

答案 0 :(得分:24)

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

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

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

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

如果这不起作用,请根据类路径以及文件的位置发布应用的配置方式。

编辑:我经常发现该网址不如InputStream有用,因此我使用getResourceAsStream代替getResource。 YMMV

答案 1 :(得分:3)

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

1)根据“user.dir”创建“file:”URL

“user.dir”属性引用当前工作目录 - 用户在启动应用程序时可能在哪里。很可能这里写的文件会在两次运行之间消失(因为用户可能从不同的目录运行)。

“user.home”属性是指用户的主目录 - 在运行之间应保持相同。

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

2)通过类加载器

检索资源

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

InputStream in = this.getClass().getClassLoader().getResourceAsStream(fileName);