SpringBoot - доступ к файлу внутри папки ресурсов

Я получаю доступ к файлу внутри папки ресурсов из основного класса

File file = new ClassPathResource("remoteUnitsIdsInOldServer.txt").getFile();

и я получаю эту ошибку:

java.io.FileNotFoundException: class path resource [remoteUnitsIdsInOldServer.txt] cannot be resolved to absolute file path because it does not reside in the file system: jar:file:/Users/lopes/Documents/workspace-sts-3.9.0.RELEASE/telefonicaUtils/target/telefonicaUtils-0.0.1-SNAPSHOT.jar!/BOOT-INF/classes!/remoteUnitsIdsInOldServer.txt

и я даже открываю файл jar и файл remoteUnitsIdsInOldServer.txt там, внутри классов

3 ответа

Решение

Это зависит от ваших требований..

Случай 1:

Учитывая, что вам нужно получить доступ к текстовому файлу с ресурса. Вы можете просто использовать apache IOUtils и ява ClassLoader,

Фрагмент (примечание: пакет IOUtils -> org.apache.commons.io.IOUtils)

    String result = "";

    ClassLoader classLoader = getClass().getClassLoader();
    try {
        result = IOUtils.toString(classLoader.getResourceAsStream("fileName"));
    } catch (IOException e) {
        e.printStackTrace();
    }

Классический способ:

StringBuilder result = new StringBuilder("");

//Get file from resources folder

ClassLoader classLoader = getClass().getClassLoader();
File file = new File(classLoader.getResource("fileName").getFile());

try (Scanner scanner = new Scanner(file)) {

    while (scanner.hasNextLine()) {
        String line = scanner.nextLine();
        result.append(line).append("\n");
    }

    scanner.close();

} catch (IOException e) {
    e.printStackTrace();
}

Случай 2:

Учитывая, что вам нужно получить доступ к свойствам из таких ресурсов, как XML, файлы свойств. Это слишком просто, просто используйте аннотацию весны @ImportResource({ "classpath:application-properties.xml", "classpath:context.properties" }) Надеюсь, что это будет полезно для вас.

Самым простым решением для меня было,

      try {
   ClassPathResource classPathResource = new 
   ClassPathResource("remoteUnitsIdsInOldServer.txt");
   byte[] data = FileCopyUtils.copyToByteArray(classPathResource.getInputStream());
   String content = new String(data, StandardCharsets.UTF_8);
} catch (Exception ex) {
  ex.printStackTrace();
}

Как правило, исходное дерево будет выглядеть так:

src/
  main/
    java/
      com/
        ...
    resources/
      remoteUnitsIdsInOldServer.txt

И, используя стандартную функциональность Maven/Gradle, получился бы JAR, подобный этому:

<JAR_ROOT>/
  com/
    ...
  remoteUnitsIdsInOldServer.txt

Ваш указанный код должен работать в этой ситуации. Тем не менее, вы упомянули, глядя в свой JAR "внутри классов". Я не думаю, что в JAR будет папка "classes".

Удачи.

Другие вопросы по тегам