使用ClassLoader加载文件

two*_*e18 11 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");
}
Run Code Online (Sandbox Code Playgroud)

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

hsURL = ClassLoader.getSystemResource("helpsets/helpset.hs");
Run Code Online (Sandbox Code Playgroud)

但是由于某些原因它不再起作用(我必须改变一些东西而不是注意到它.它返回null.

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

我正在使用eclipse,我尝试在构建路径(classpath)中包含该文件夹而不包括它,它似乎没有什么区别.

Jon*_*eet 24

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

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

Foo.class.getResource("/helpsets/helpset.hs");
Run Code Online (Sandbox Code Playgroud)

(ClassLoader.getResource是"绝对的"; Class.getResource是相对于类的包,除非你用'/'作为前缀.)

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

编辑:我通常发现URL不如a InputStream,所以我使用getResourceAsStream而不是getResource.因人而异

  • @ twolfe18:是的,所以使用答案中显示的"/helpsets/helpset.hs".@Rich:是的,会编辑提及. (2认同)