使用File.getAbsolutePath时ClassLoader.getResource返回null

时间:2019-05-30 16:50:15

标签: java file config

我有一个需要打开的config.ini文件,该文件在目录中很远,因此我使用File.getAbsolutePath()设置了基本目录并连接了路径的其余部分。

打印路径后,我得到了可以粘贴到文件资源管理器中的正确路径,但是返回的对象为空。

因此,我首先以如下方式初始化我的Properties和ClassLoader:

Properties prop = new Properties();
ClassLoader classLoader = Test.class.getClassLoader();

然后创建路径。我尝试转义反斜杠(1)和正斜杠(2),都返回null,但两个路径都在文件资源管理器中工作。

String absPath = new File("").getAbsolutePath();
absPath = absPath.concat("\\resources\\config\\config.ini"); // (1)
absPath = absPath.concat("/resources/config/config.ini"); // (2)

然后我尝试设置URL以打开InputStream

URL res = Objects.requireNonNull(classLoader.getResource(absPath), "Unable to open config.ini");
InputStream is = new FileInputStream(res.getFile());

但是,以下内容返回null。

classLoader.getResource(absPath)

我希望这样做可以正确打开文件,因为路径正确。我正在使用Intelij,并且我读到我需要在设置>编译器下添加.ini资源文件,虽然这样做,但是并不能解决我的问题。

谢谢!

1 个答案:

答案 0 :(得分:0)

这不是通过类加载器加载资源的方法。

如果您的类路径类似于以下内容...

java -cp resources;lib/my.jar ... org.mypack.MyClass

然后使用此路径加载

getClassLoader().getResource("/config/config.ini");

您的类路径包括resources文件夹,然后从那里加载类加载器。

操作系统的绝对路径肯定不在classpath中。

无论如何,必须确保resource文件夹位于类路径中。

如果您的配置文件不在类路径中,则无法使用类加载器加载该文件。

还有一件事,如果您的配置不在类路径中,而是在工作目录的子目录中,为什么您不能简单地使用new FileInputStream("resources/config/config.ini");