открыть ресурс с относительным путем в java
В моем 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, который будет загружать мои ресурсы (каталог и файл).
Что касается файла, я попробовал
resourcesloader.class.getClass().getResource("repository/SSL-Key/cert.jks").toString()
для того, чтобы получить реальный путь, но этот путь не работает.
Я понятия не имею, как это сделать каталог.
11 ответов:
укажите путь относительно загрузчика классов, а не класс, из которого вы получаете загрузчик. Например:
resourcesloader.class.getClassLoader().getResource("package1/resources/repository/SSL-Key/cert.jks").toString();
у меня были проблемы с помощью
getClass().getResource("filename.txt")
метод. После прочтения инструкций Java docs, если ваш ресурс не находится в том же пакете, что и класс, из которого вы пытаетесь получить доступ к ресурсу, то вы должны дать ему относительный путь, начинающийся с'/'
. Рекомендуется поместить файлы ресурсов в папку "ресурсы" в корневом каталоге. Так например если у вас есть структура:src/main/com/mycompany/myapp
затем вы можете добавить папку ресурсов в соответствии с рекомендациями maven in:
src/main/resources
кроме того, вы можете добавить подпапки в папку ресурсов
src/main/resources/textfiles
и скажите, что ваш файл называется
myfile.txt
так что у вас естьsrc/main/resources/textfiles/myfile.txt
теперь вот где возникает проблема глупого пути. Скажем, у вас есть класс
com.mycompany.myapp package
, а вы хотите получить доступ кmyfile.txt
файл из папки ресурсов. Некоторые говорят, что вам нужно дать:"/main/resources/textfiles/myfile.txt" path
или
"/resources/textfiles/myfile.txt"
оба не правы. После Того, Как Я РАН
mvn clean compile
файлы и папки копируются в:. Но папки ресурсов там нет, только папки в папке ресурсов. Так что у вас есть:myapp/target/classes
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"
папка также будет найдена под"myapp/target/classes"
в надежде предоставить дополнительную информацию для тех, кто не берет это так быстро, как другие, я хотел бы предоставить свой сценарий, поскольку он имеет немного другую настройку. Мой проект был настроен со следующей структурой каталогов (с помощью Eclipse):
Project/ src/ // application source code org/ myproject/ MyClass.java test/ // unit tests res/ // resources images/ // PNG images for icons my-image.png xml/ // XSD files for validating XML files with JAXB my-schema.xsd conf/ // default .conf file for Log4j log4j.conf lib/ // libraries added to build-path via project settingsу меня были проблемы с погрузкой моих ресурсов от res
@GianCarlo: Вы можете попробовать вызвать System property 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);
когда вы используете 'getResource' для класса, относительный путь решается на основе пакета, в котором находится класс. При использовании "getResource" в загрузчике классов относительный путь разрешается на основе корневой папки.
Если вы используете абсолютный путь, оба метода getResource будут запускаться в корневой папке.
для тех, кто использует eclipse + maven. Скажем, вы пытаетесь получить доступ к файлу
images/pic.jpg
insrc/main/resources
. Делаем это так:ClassLoader loader = MyClass.class.getClassLoader(); File file = new File(loader.getResource("images/pic.jpg").getFile());
совершенно правильно,но может привести к исключению нулевого указателя. Похоже, что eclipse не распознает папки в структуре каталогов maven как исходные папки сразу. Удалив и то
src/main/resources
папка из списка исходных папок проекта и ее возврат (project>properties>java build path> source>remove / add Folder), я смог решить это.
resourcesloader.class.getClass()
можно разбить на:
Class<resourcesloader> clazz = resourceloader.class; Class<Class> classClass = clazz.getClass();
что означает, что вы пытаетесь загрузить ресурс с помощью класса начальной загрузки.
вместо этого вы, вероятно, хотите что-то вроде:
resourcesloader.class.getResource("repository/SSL-Key/cert.jks").toString()
Если только javac предупредил о вызове статических методов в нестатических контекстах...
Doe следующая работа?
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()
должно быть одно и то же?
Я сделал небольшую модификацию на @jonathan.конус один лайнер ( путем добавления
.getFile()
), чтобы избежать исключения нулевого указателя, и задав путь к каталогу данных. Вот что сработало для меня:String realmID = new java.util.Scanner(new java.io.File(RandomDataGenerator.class.getClassLoader().getResource("data/aa-qa-id.csv").getFile().toString())).next();