【问题标题】:Loading files with ClassLoader使用 ClassLoader 加载文件
【发布时间】:2009-07-13 14:22:49
【问题描述】:

这个问题困扰了我一段时间。我必须在我的 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,我已经尝试在构建路径(类路径)中包含该文件夹并且不包含它,它似乎没有任何区别。

【问题讨论】:

    标签: java file classloader


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • 如果你只对内容感兴趣,你最好在 ClassLoader 上使用 getResourceAsStream()
    • 好吧,我还没有得到这个工作。我正在尝试加载一个与我从中加载它的类不同的包中的文件,所以我需要某种绝对引用。
    • @twolfe18:是的,所以使用“/helpsets/helpset.hs”,如答案所示。 @Rich:是的,将编辑提及这一点。
    • 项目文件夹中有源码包和helpsets包。源包设置如下:src/foo/bar/my_class
    • 除非 helpets 包设置为包含在输出中(例如,通过使其成为源路径),否则它不会出现在 bin 目录中(或您放置输出的任何位置) ) 所以你将无法获得它。
    【解决方案2】:

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

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

    “user.dir”属性指的是当前工作目录——用户在启动应用程序时可能所在的位置。此处写入的文件很有可能会在两次运行之间消失(因为用户可能从不同的目录运行)。

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-11
      • 1970-01-01
      相关资源
      最近更新 更多