Я хочу создать строку из содержимого файла. По this answer Я делаю это так:Cann't получить файл из пути к классам (с помощью NIO2)
private static String buildStringFromTemplate(String stringTemplatePath) throws IOException {
byte[] encoded = Files.readAllBytes(Paths.get(stringTemplatePath));
return new String(encoded, "UTF-8");
}
(Как я понимаю, что это путь нового NiO2 API, который является частью Java 7.)
stringTemplatePath параметр является имя файла ("template.html"). Я проверяю местоположение этого файла. Он находится в пути к классам: ../classes/template.html
После вызова этой функции я получаю исключение:
java.nio.file.NoSuchFileException: template.html
Может быть, я посылаю параметр имени файла в неправильном пути? Я попытался отправить эту модификацию: «file: ///template.html» и «classpath: template.html», но это не помогло.
Также я попробовал этот код:
private static String buildStringFromTemplate(String stringTemplatePath) throws IOException {
File file = new File(stringTemplatePath);
String absolutePath = file.getAbsolutePath();
byte[] encoded = Files.readAllBytes(Paths.get(absolutePath));
return new String(encoded, "UTF-8");
}
я назвал эту функцию я получаю следующее исключение:
java.nio.file.NoSuchFileException: /opt/repo/versions/8.0.9/temp/template.html
Так, файл в путь к классам, потому что новый файл (stringTemplatePath) может создать файл , Но этот файл имеет очень странный путь (/opt/repo/versions/8.0.9/temp/template.html). Я использую Jelastic как хостинг (enviroment: Java 8, Tomcat 8), если это метр.
UPDATE: ЗАВЕРШЕНИЕ РАБОЧЕГО РАСТВОРА:
private static String buildStringFromTemplate(String stringTemplatePath) throws IOException {
InputStream inputStream = MyClass.class.getClassLoader().getResourceAsStream(stringTemplatePath);
return IOUtils.toString(inputStream, "UTF-8");
}
IOUtils является Util класс от Apache IO Общин.
Impotant примечание:
Если я просто призываю .getResourceAsStream (...) из класса, ресурсный файл будет не найти и метод возвращает нуль:
MyClass.class.getResourceAsStream(stringTemplatePath);
Итак, я вызываю .getClassLoader() перед вызовом .getResourceAsStream (...) и она прекрасно работает:
MyClass.class.getClassLoader().getResourceAsStream(stringTemplatePath);
Не используйте Path (или File; в 2015 году вообще не используйте File) для доступа к ресурсам в файловой системе! Существует '.getResourceAsStream()' для этого – fge
@fge Thx! С **. GetResourceAsStream() ** все работает отлично! Вы опубликуете свой ответ? – Sergey