代码之家  ›  专栏  ›  技术社区  ›  twolfe18

使用类加载器加载文件

  •  11
  • twolfe18  · 技术社区  · 17 年前

    这个问题困扰了我一段时间。我必须在我的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");
    

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

    我正在使用eclipse,我已经尝试在构建路径(classpath)中包含文件夹,但没有包含它,这似乎没有什么区别。

    2 回复  |  直到 13 年前
        1
  •  26
  •   Jon Skeet    17 年前

    getSystemResource 系统 ClassLoader.getSystemClassLoader )

    ClassLoader.getResource() 或 Class.getResource 来自一个合适的类别,例如。

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

    ClassLoader.getResource 是“绝对的”; Class.getResource 是相对于类的包的,除非使用“/”作为前缀。)

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

    编辑:我通常觉得URL不如 InputStream ,所以我用 getResourceAsStream getResource . YMMV

        2
  •  4
  •   kdgregory    17 年前

    你在这里提到了几件不同的事情,让我们把它们整理一下。

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

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

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

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

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

    这意味着检索与应用程序一起打包的文件——只读文件。如您所见,有多种变体。我更喜欢使用下面的方法,因为我假设一个类将要加载一个与它一起打包的文件。

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