2017-01-16 14 views
1

Я использую:Путь не работает; используя File.separator

  • JDK 1.8.0.71
  • IntelliJ 2016.3.2
  • Win7

мне было интересно, почему этот путь не работает:

public static final String ZPL_TEMPLATE = 
        File.separator 
        + "templates" 
        + File.separator 
        + "Template.txt"; 

еще этот хорошо работает:

public static final String TEMPLATE = "/templates/Template.txt"; 

Вот где используется (это в другом пакете):

InputStream is = this.getClass().getResourceAsStream(TEMPLATE); 

EDIT: исключение:

... 
java.lang.NullPointerException: null 
    at java.io.Reader.<init>(Reader.java:78) 
    at java.io.InputStreamReader.<init>(InputStreamReader.java:72) 
    ... 
+0

Извиняется за очень невнятный вопрос, но вы уверены, что «/templates/ZPLTemplate.txt» существует? Приведенный вами пример работает «/templates/Template.txt» без ZPL. Просто проверяю. – phss

+0

Кроме того, не могли бы вы дать нам информацию об ошибке, которую вы получаете? – phss

+0

попробуйте использовать 'FileSystems.getDefault(). GetSeparator();' – Jobin

ответ

2

При доступе к внутреннему ресурсу, как вы сделали с getResouceAsStream, файлом разделитель должен быть /.

Я считаю, что вы находитесь на машине с Windows, поэтому разделитель файлов \.

Для получения дополнительной информации см. How to use file separator when loading resources.

+0

Ссылка, которую вы предоставили, не работает (по крайней мере, не для меня) –

+0

Исправлено. Это было дополнительное пространство в конце ... Спасибо, @ 4673_j – Zack

+0

Право .. Я надеялся на какой-то системный разделитель; но я думаю, что простота лучше, достаточно ясно в приведенной ссылке. Вперед косой чертой. –

2

Becaseuse файл Сепаратор на Win 7, '\' и как указано в документе для getResourceAsStream

Перед делегированием абсолютное имя ресурса строится из данного имени ресурса с использованием этого алгоритма:

Если имя начинается с символа '/' ('\ u002f'), то абсолютное имя ресурса является частью названия, следующего за '/'. В противном случае абсолютное имя имеет следующую форму: modified_package_name/name Если имя modified_package_name является именем пакета этого объекта с '/', замененным на '.' ('\ U002e').

1

getResourceAsStream ожидать имя ресурса как параметра, а не путь к файлу.

Ресурсов имена в Java разделены слэшами /, независимо от файловой системы (имена ресурсов/путь представляет собой путь на пути к классам, а не в файловой системе).

Следовательно, вы не можете использовать секвенсор файловой системы для создания имени ресурса. На окнах это будет обратная косая черта. \

 Смежные вопросы

  • Нет связанных вопросов^_^