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".
Удачи.