Я загружаю текстовый файл из пакета в скомпилированный JAR-файл моего Java-проекта. Соответствующая структура каталогов выглядит следующим образом:
/src/initialization/Lifepaths.txt
Мой код загружает файл, вызывая, Class::getResourceAsStream
чтобы вернуть InputStream
.
public class Lifepaths {
public static void execute() {
System.out.println(Lifepaths.class.getClass().
getResourceAsStream("/initialization/Lifepaths.txt"));
}
private Lifepaths() {}
//This is temporary; will eventually be called from outside
public static void main(String[] args) {execute();}
}
Распечатка всегда будет печатать null
, независимо от того, что я использую. Я не уверен, почему вышеупомянутое не будет работать, поэтому я также попытался:
"/src/initialization/Lifepaths.txt"
"initialization/Lifepaths.txt"
"Lifepaths.txt"
Ни одна из этих работ. Я уже прочитал множество вопросов по этой теме, но ни один из них не помог - обычно они просто говорят, чтобы загружать файлы, используя корневой путь, что я уже делаю. Это или просто загрузить файл из текущей директории (просто загрузить filename
), что я тоже пробовал. Файл компилируется в JAR в соответствующем месте с соответствующим именем.
Как мне это решить?
Lifepaths.class
. При этом, почему этоgetClassLoader()
позволяет работать? (Кроме того, не стесняйтесьLifepaths.getClass()
? Нет такого статического метода, определенного в Object ...getResource(String)
. Кстати, у меня всегда были проблемы с тем, чтобы заставить кого-то из них работать вstatic
контексте. Проблема в основном в том, что получаемый загрузчик классов предназначен для классов J2SE. Вам необходимо получить доступ к загрузчику классов контекста, который предназначен для самого приложения.Ответы:
Lifepaths.class.getClass().getResourceAsStream(...)
загружает ресурсы, используя системный загрузчик классов, он явно не работает, потому что он не видит ваши файлы JARLifepaths.class.getResourceAsStream(...)
загружает ресурсы, используя тот же загрузчик классов, что и класс Lifepaths, и он должен иметь доступ к ресурсам в ваших JAR-файлахисточник
/
перед вашим путем, если ваш файл находится в другом каталоге; напримерinitialization/Lifepaths.txt
. Если путь к файлу такой же, как у класса yout (но в ресурсах, как у main dir), вы можете просто указать имя файла без такового/
. Например, если ваш класс имеет следующий путьsrc/main/java/paths/Lifepaths.java
, ваш файл должен иметь этот путьsrc/main/resources/paths/Lifepaths.txt
.