В моем приложении Java мне нужно получить несколько файлов и каталогов.
Это структура программы:
./main.java
./package1/guiclass.java
./package1/resources/resourcesloader.java
./package1/resources/repository/modules/ -> this is the dir I need to get
./package1/resources/repository/SSL-Key/cert.jks -> this is the file I need to get
guiclass
загружает класс загрузчика ресурсов, который загрузит мои ресурсы (каталог и файл).
Что касается файла, то попробовал
resourcesloader.class.getClass().getResource("repository/SSL-Key/cert.jks").toString()
чтобы получить реальный путь, но этот способ не работает.
Я понятия не имею, какой путь использовать для каталога.
Ответы:
Укажите путь относительно загрузчика классов, а не класса, из которого вы получаете загрузчик. Например:
resourcesloader.class.getClassLoader().getResource("package1/resources/repository/SSL-Key/cert.jks").toString();
источник
У меня возникли проблемы с использованием
getClass().getResource("filename.txt")
метода. После прочтения инструкций документации Java, если ваш ресурс не находится в том же пакете, что и класс, из которого вы пытаетесь получить доступ к ресурсу, тогда вы должны указать ему относительный путь, начиная с'/'
. Рекомендуемая стратегия - поместить файлы ресурсов в папку «ресурсы» в корневом каталоге. Так, например, если у вас есть структура:тогда вы можете добавить папку ресурсов, как рекомендовано maven в:
кроме того, вы можете добавить подпапки в папку ресурсов
и скажите, что ваш файл называется,
myfile.txt
поэтому у вас естьИ вот здесь возникает проблема глупого пути. Допустим, у вас есть класс в вашем
com.mycompany.myapp package
, и вы хотите получить доступ кmyfile.txt
файлу из папки ресурсов. Некоторые говорят, что вам нужно дать:"/main/resources/textfiles/myfile.txt" path
или же
"/resources/textfiles/myfile.txt"
оба из них неверны. После запуска
mvn clean compile
файлы и папки копируются в:папка. Но папки ресурсов там нет, только папки в папке ресурсов. Так что у тебя есть:
myapp/target/classes/textfiles/myfile.txt myapp/target/classes/com/mycompany/myapp/*
поэтому правильный путь к
getClass().getResource("")
методу:"/textfiles/myfile.txt"
вот:
getClass().getResource("/textfiles/myfile.txt")
Это больше не будет возвращать null, но вернет ваш класс. Надеюсь, это кому-нибудь поможет. Мне странно, что
"resources"
копируется не папка, а только подпапки и файлы прямо в"resources"
папке. Мне казалось бы логичным, что"resources"
папка также будет находиться в"myapp/target/classes"
источник
target/classes
я могу видеть только файлы в основных ресурсах, но не тестовые ресурсы. Почему?mvn clean test-compile
команду, как это происходитcompile
в жизненном цикле Maven . Это сгенерируетtarget/test-classes
.В надежде предоставить дополнительную информацию для тех, кто не улавливает это так быстро, как другие, я хотел бы представить свой сценарий, поскольку он имеет немного другую настройку. Мой проект был настроен со следующей структурой каталогов (с использованием Eclipse):
У меня возникли проблемы с загрузкой моих ресурсов из каталога res . Я хотел, чтобы все мои ресурсы были отделены от исходного кода (просто для целей управления / организации). Итак, что мне нужно было сделать, так это добавить каталог res в путь сборки, а затем получить доступ к ресурсу через:
static final ClassLoader loader = MyClass.class.getClassLoader(); // in some function loader.getResource("images/my-image.png"); loader.getResource("xml/my-schema.xsd"); loader.getResource("conf/log4j.conf");
ПРИМЕЧАНИЕ. Символ
/
отсутствует в начале строки ресурса, поскольку я использую ClassLoader.getResource (String) вместо Class.getResource (String) .источник
/
в начале пути ресурса, был ключевым!Когда вы используете getResource для класса, относительный путь разрешается на основе пакета, в котором находится класс. Когда вы используете getResource для ClassLoader, относительный путь разрешается на основе корневой папки.
Если вы используете абсолютный путь, оба метода getResource будут запускаться в корневой папке.
источник
/
getResource
с абсолютным путем начинается с корневой папки? Разве цель абсолютного пути не абсолютна ?@GianCarlo: вы можете попробовать вызвать системное свойство user.dir, которое предоставит вам корень вашего java-проекта, а затем добавьте этот путь к своему относительному пути, например:
String root = System.getProperty("user.dir"); String filepath = "/path/to/yourfile.txt"; // in case of Windows: "\\path \\to\\yourfile.txt String abspath = root+filepath; // using above path read your file into byte [] File file = new File(abspath); FileInputStream fis = new FileInputStream(file); byte []filebytes = new byte[(int)file.length()]; fis.read(filebytes);
источник
File
на ресурс внутри файла jar, только на правильную запись в файловой системе (например, на сам jar).Для тех, кто использует eclipse + maven. Скажем, вы пытаетесь получить доступ к файлу
images/pic.jpg
в форматеsrc/main/resources
. Делаем это так:ClassLoader loader = MyClass.class.getClassLoader(); File file = new File(loader.getResource("images/pic.jpg").getFile());
совершенно правильно, но может привести к исключению нулевого указателя. Похоже, что eclipse не распознает папки в структуре каталогов maven как исходные папки сразу. Удалив
src/main/resources
папку и из списка исходных папок проекта и вернув ее (проект> свойства> путь сборки java> источник> удалить / добавить папку), я смог решить эту проблему.источник
Можно разбить на:
Это означает, что вы пытаетесь загрузить ресурс с помощью класса начальной загрузки.
Вместо этого вы, вероятно, захотите что-то вроде:
resourcesloader.class.getResource("repository/SSL-Key/cert.jks").toString()
Если бы только javac предупреждал о вызове статических методов в нестатических контекстах ...
источник
Выполняются ли следующие работы?
resourcesloader.class.getClass().getResource("/package1/resources/repository/SSL-Key/cert.jks")
По какой причине вы не можете указать полный путь, включая пакет?
источник
Следуя двум ответам, упомянутым выше. Первый
resourcesloader.class.getClassLoader().getResource("package1/resources/repository/SSL-Key/cert.jks").toString(); resourcesloader.class.getResource("repository/SSL-Key/cert.jks").toString()
Должно быть одно и то же?
источник
Чтобы получить реальный путь к файлу, вы можете попробовать следующее:
URL fileUrl = Resourceloader.class.getResource("resources/repository/SSL-Key/cert.jks"); String pathToClass = fileUrl.getPath;
Resourceloader - это имя класса здесь. "resources / repository / SSL-Key / cert.jks" - относительный путь к файлу. Если бы у вас был guiclass в ./package1/java с остальной структурой папок, вы бы выбрали "../resources/repository/SSL-Key/cert.jks" как относительный путь из-за правил, определяющих относительный путь.
Таким образом, вы можете читать свой файл с помощью BufferedReader. НЕ ИСПОЛЬЗУЙТЕ СТРОКУ для определения пути к файлу, потому что, если в вашем пути есть пробелы или символы неанглийского алфавита, у вас возникнут проблемы, и файл не будет найден.
BufferedReader bufferedReader = new BufferedReader( new InputStreamReader(fileUrl.openStream()));
источник
Я внес небольшие изменения в один лайнер @ jonathan.cone (добавив
.getFile()
), чтобы избежать исключения с нулевым указателем, и установил путь к каталогу данных. Вот что у меня сработало:String realmID = new java.util.Scanner(new java.io.File(RandomDataGenerator.class.getClassLoader().getResource("data/aa-qa-id.csv").getFile().toString())).next();
источник
Использовать этот:
resourcesloader.class.getClassLoader().getResource("/path/to/file").**getPath();**
источник