ClassLoader.getResource возвращает ноль при использовании File.getAbsolutePath - PullRequest
0 голосов
/ 30 мая 2019

У меня есть файл config.ini, который мне нужно открыть, который находится довольно далеко назад в каталоге, поэтому я использовал File.getAbsolutePath (), чтобы установить базовый каталог, и конкатенировал оставшуюся часть пути.

Распечатывая путь, я получаю правильный путь, который могу вставить в проводник, но возвращаемый объект имеет значение null.

Итак, я начал с инициализации моих свойств и ClassLoader следующим образом:

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

Тогда я создаю путь.Я попытался избежать обратной косой черты (1) и прямой косой черты (2), оба возвращают ноль, но оба пути работают в проводнике файлов.

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());

Однако следующее возвращает ноль.

classLoader.getResource(absPath)

Я ожидал, что это откроет файл должным образом, поскольку путь был правильным.Я использую Intelij, и я прочитал, что мне нужно было добавить файл ресурсов .ini в настройки> компилятор, что я и сделал, но это не решило мою проблему.

Спасибо!

1 Ответ

0 голосов
/ 30 мая 2019

Это не способ загрузки ресурсов через загрузчики классов.

Если ваш путь к классу похож на следующий ...

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

, тогда вы загружаетеэто с этим путем

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

Ваш classpath включает в себя папку resources, и загрузчик классов загружается оттуда.

Абсолютный путь к ОС, безусловно, отсутствует в classpath.

В любом случае вы должны быть уверены, что папка resource находится в classpath.

Если ваш файл конфигурации не находится в classpath, вы не можете использовать загрузчики классов для загрузки этого файла.

Еще одна вещь, если ваша конфигурация не в classpath, а в дочернем каталоге вашего рабочего каталога, почему вы не можете просто использовать new FileInputStream("resources/config/config.ini");

...