2013-10-01 3 views
6

Я хочу прочитать файл в моей папке ресурсов в своем проекте Java. Я использовал следующий код для этогоПолучить файл в папке ресурсов в Java

MyClass.class.getResource("/myFile.xsd").getPath(); 

И я хотел проверить путь к файлу. Но это дает следующему пути

file:/home/malintha/.m2/repository/org/wso2/carbon/automation/org.wso2.carbon.automation.engine/4.2.0-SNAPSHOT/org.wso2.carbon.automation.engine-4.2.0-SNAPSHOT.jar!/myFile.xsd 

я получаю путь к файлу в репозиториях Maven зависимостей и он не получает файл. Как я могу это сделать?

ответ

4

Вам необходимо указать путь вашей папки res.

MyClass.class.getResource("/res/path/to/the/file/myFile.xsd").getPath(); 
3

Является ли ваш каталог ресурсов в пути к классам?

Вы не включая каталог ресурсов на своем пути:

MyClass.class.getResource("/${YOUR_RES_DIR_HERE}/myFile.xsd").getPath(); 
0

Это не представляется возможным получить доступ к ресурсам других модулей Maven. Поэтому вам необходимо предоставить свой ресурс myFile.xsd в папке src/main/resources или src/test/resources.

0

Путь верный, хотя и не в файловой системе, а внутри банки. То есть, потому что банка бежала. Ресурс никогда не гарантированно является файлом.

Однако, если вы не хотите использовать ресурсы, вы можете использовать zip-файловую систему. Однако Files.copy было бы достаточно, чтобы скопировать файл за пределы банки. Изменение файла внутри банку - плохая идея. Лучше использовать ресурс как «шаблон», чтобы сделать первоначальную копию в домашнем (подкаталоге) пользователя (System.getProperty("user.home")).

1

Надежный способ создания экземпляра файла из папки ресурсов это скопировать ресурс как поток во временный файл (временный файл будет удален, когда JVM выходит):

public static File getResourceAsFile(String resourcePath) { 
    try { 
     InputStream in = ClassLoader.getSystemClassLoader().getResourceAsStream(resourcePath); 
     if (in == null) { 
      return null; 
     } 

     File tempFile = File.createTempFile(String.valueOf(in.hashCode()), ".tmp"); 
     tempFile.deleteOnExit(); 

     try (FileOutputStream out = new FileOutputStream(tempFile)) { 
      //copy stream 
      byte[] buffer = new byte[1024]; 
      int bytesRead; 
      while ((bytesRead = in.read(buffer)) != -1) { 
       out.write(buffer, 0, bytesRead); 
      } 
     } 
     return tempFile; 
    } catch (IOException e) { 
     e.printStackTrace(); 
     return null; 
    } 
} 
Смежные вопросы