2015-04-15 3 views
0

Я хочу создать строку из содержимого файла. По 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); 
+1

Не используйте Path (или File; в 2015 году вообще не используйте File) для доступа к ресурсам в файловой системе! Существует '.getResourceAsStream()' для этого – fge

+0

@fge Thx! С **. GetResourceAsStream() ** все работает отлично! Вы опубликуете свой ответ? – Sergey

ответ

2

Вы не должны пытаться и получать доступ к ресурсам в вашем пути к классам как Path.

Хотя это, вероятно, будет работать, когда ваш проект находится в вашей настройке IDE, он не будет, как только ваш проект будет упакован в виде банки; тогда невозможно получить к ним доступ, используя даже Path (и даже при том, что вы можете открывать почтовые файлы, поэтому банки, как FileSystem s).

Используйте выделенные методы, чтобы сделать это вместо того, чтобы, начиная с .getResourceAsStream():

final InputStream in = MyClass.class.getResourceAsStream("/path/to/resource"); 

Обратите внимание, что вам нужно будет проверить, является ли код возврата этого метода является null (это то, что возвращается, если ресурс не найден в пути к классам).

+0

К сожалению ** MyClass.class.getResourceAsStream (...); ** не работает для меня. В моем случае работает следующий код: ** MyClass.class.getClassLoader(). GetResourceAsStream (...); ** Еще раз спасибо за вашу помощь! – Sergey

1

Если файл действительно часть пути к классам, вы должны использовать: ClassName.class.getResourceAsStream("/file name") это возвращение InputStraem
или
ClassName.class.getResource("/file name") это возвращение URL