Подтвердить что ты не робот

Размещение файла в пути к классам

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

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-метод этого класса. Но я получаю ошибку, не могу найти указанный файл, как если бы его не на пути к классам, но он внутри файла войны? Я строю проект с maven, и я помещаю файл в src/main/resources Это ошибка, которую я получаю при попытке прочитать файл:

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

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

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

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

ИЗМЕНИТЬ

Когда я редактирую свой код в соответствии с решением @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
4b9b3361

Ответ 1

API IO Java опирается на локальную файловую систему на диске, а не на путь класса. Кроме того, использование относительных путей в 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 во время сборки, является нормальным. Он покрывается классом. Ваша проблема лежит где-то в другом месте. Вы уверены, что имя ресурса верное? Вы уверены, что используете код, который, по вашему мнению, работает?