поиск файла в пути к классам - PullRequest
12 голосов
/ 19 апреля 2010

Я пытаюсь прочитать содержимое файла, например:

public void myMethod(){
     FileInputStream fstream = new FileInputStream(fileLocation);
     BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
     String strLine;
     while ((strLine = br.readLine()) != null) {
....
....
.....
end while 
end method

И у меня есть в начале тела класса private String fileLocation;, и в конце класса у меня есть метод получения и установки для него. Теперь я пытаюсь внедрить это местоположение файла из Spring внутри bean-компонента этого класса и указываю init-метод этого класса. Но я получаю сообщение об ошибке, не могу найти указанный файл, как будто его нет на пути к классам, но он находится внутри файла war? Я строю проект с помощью Maven и помещаю файл в src/main/resources Это ошибка, которую я получаю при попытке прочитать файл:

Ошибка: src \ main \ resources \ ids.txt (Система не может найти путь указано)

Вот когда я попробовал это:

FileInputStream fstream = new FileInputStream("src\\main\\resources\\ids.txt");

как правильно ссылаться на путь к классам?

EDIT

Когда я редактирую свой код в соответствии с решением @BalusC, вот как это выглядит, но я все равно получаю null ошибку:

ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 
   InputStream input = classLoader.getResourceAsStream("src/main/resources/ids.txt");
   BufferedReader br = new BufferedReader(new InputStreamReader(input));
   String strLine;
 while ((strLine = br.readLine()) != null) {
    ....
    ....
    .....
    end while 
    end method

1 Ответ

24 голосов
/ 19 апреля 2010

API Java IO использует файловую систему локального диска, а не путь к классам. Кроме того, использование относительных путей в Java IO - это рецепт проблем переносимости, не полагайтесь на это. Для распределения ресурсов в пути к классам вы обычно используете ClassLoader#getResource() или ClassLoader#getResourceAsStream().

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream input = classLoader.getResourceAsStream("src/main/resources/ids.txt");

Тем не менее, вам не нужна эта DataInputStream строка. Вы на самом деле не получаете никакой выгоды от этого.

Обновление : если это не сработает, то либо имя ресурса просто неверно, либо файл фактически отсутствует в пути к классам, где вы ожидаете. Мои центы на том, что папка src на самом деле является root пути к классам, а не частью пакета. Уберите его из названия.

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

for (URL root : Collections.list(Thread.currentThread().getContextClassLoader().getResources(""))) {
    System.out.println(root);
}

Имя ресурса должно быть относительно любого из них. То, что он был помещен в /WEB-INF/classes во время сборки, это нормально. Это покрыто classpath. Ваша проблема лежит где-то еще. Вы уверены, что имя ресурса правильное? Вы уверены, что запускаете код, который, как вы думаете, вы запускаете?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...