открыть ресурс с относительным путем в 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 71

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 in src/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();

используйте этот:

resourcesloader.class.getClassLoader().getResource("/path/to/file").**getPath();**