Обозначение с двойной точкой больше не работает из classpth (из корзины при использовании eclipse) для Class.getResouce ()?

Одним из распространенных способов загрузки файла ресурсов является использование метода Class.getResource(String name), который выполняет поиск из classpath приложения.

FileReader может читать из файла даже за пределами папки проекта с двойными точками. Например, с помощью eclipse вы можете прочитать workspace/test.txt с помощью ../test.txt. Но когда я играл с методом getResource(), он мог получить файл с нотацией с двойной точкой только тогда, когда файл находится в папке bin. Если вы поместите файл за пределы папки bin, запись с двумя точками больше не работает. Я попытался проследить исходный код до ClassLoader.getResource(), ClassLoader.parent.findResouce() и sun.misc.Launcher$AppClassLoader, но не смог разобраться дальше. это на виндовс 10.

Я должен добавить пример здесь. У меня есть файл test.txt и проект Java1 в eclipse.

workspace/project1/src/package1/test.java 

может прочитать файл test.txt из

workspace/test.txt 

местоположение с "../test.txt" с FileReader (расположение по умолчанию для eclipse кажется рабочей областью/проект1/). Но с getResouce() запись с двумя точками работает до тех пор, пока файл помещается в рабочую область/проект1/bin, но не из папки bin.

У меня есть вопросы по вышеизложенному:

1, почему запись с двумя точками не может вывести вас из папки bin с помощью getResouce(), но может сделать это с помощью FileReader?

2. Учитывая поведение getResouce(), я предполагаю, что eclipse успешно добавил каталог bin в проект classpath. В файле .classpath для проекта есть еще одна строка:

<classpathentry kind="src" path="src"/>

Папка src не добавляется в classpath? Так как getResouce() там вроде не ищет.


person Jesse Zhuang    schedule 16.02.2016    source источник


Ответы (1)


почему нотация с двумя точками не может вывести вас из папки bin с помощью getResouce(), но может сделать это с помощью FileReader?

Потому что они ищут файлы в разных пространствах имен. В случае FileReader пространством имен является пространство имен файловой системы, а корнем является корневой каталог вашей системы. В случае getResource() пространство имен — это пространство имен, соответствующее пути к классам. Верхняя часть этого пространства имен обычно соответствует любым каталогам в пути к классам и корневым индексам любых архивов в пути к классам.

В любом случае вы не можете использовать «..» для перехода выше верхней части пространства имен.

Добавляет ли eclipse каталог «src» в путь к классам, когда приложение запускается локально с помощью eclipse?

По умолчанию я думаю, что ответ «Нет». Очевидно, вы можете изменить это через свойства конфигурации лаунчера.

Если вы хотите быть уверены, что на самом деле представляет собой путь к классам среды выполнения, распечатайте значение:

    System.getProperty("java.class.path")
person Stephen C    schedule 17.02.2016
comment
Спасибо, а как насчет моего второго вопроса? Добавляет ли eclipse каталог «src» в путь к классам, когда приложение запускается локально с помощью eclipse? getResource() не может найти файл, если он находится в «src», и я думал, что ранее он был добавлен в путь к классам. - person Jesse Zhuang; 18.02.2016
comment
интересно, я думал, что эта строка ‹classpathentry kind=src path=src/› добавляет 'src' к classpth java, по-видимому, нет: stackoverflow.com/questions/9276421/ - person Jesse Zhuang; 19.02.2016
comment
Это аналогично параметру -sourcepath в командной строке javac. Видите вид=источник? - person Stephen C; 19.02.2016