Netbeans: попытка загрузить файл, но он не найден (Java)

У меня каждый раз возникает одна и та же проблема, когда я пытаюсь загрузить файлы с Java в Netbeans (6.9). Кажется, что файлы не найдены. Я получаю сообщение об ошибке:

java.lang.NullPointerException

В контексте:

File file = new File(this.getClass().getClassLoader().getResource("file.xml").getFile());
// or this also don't work
File file = new File("file.xml");

Файл file.xml находится в том же каталоге, что и файл Main.java. Как я могу загрузить этот файл?


person Poru    schedule 13.12.2010    source источник
comment
Я предполагаю, что вам нужно переместить file.xml в каталог верхнего уровня вашего проекта netbeans.   -  person jjnguy    schedule 14.12.2010
comment
Обычно мы помещаем файлы ресурсов xml в корневой каталог проекта, чтобы Netbeans мог их найти.   -  person Costis Aivalis    schedule 14.12.2010
comment
Я тоже пробовал, но с той же ошибкой.   -  person Poru    schedule 14.12.2010
comment
На данный момент это выглядит так: i.imgur.com/vjFjl.jpg   -  person Poru    schedule 14.12.2010


Ответы (3)


Это должно работать (это работает для меня):

String path = URLDecoder.decode(getClass().getResource("file.xml").getFile(), "UTF-8");
File f = new File(path);

Если я правильно понимаю Javadocs, это должно быть таким же, как использование getClass().getClassloader().getResource(), но по моему опыту это другое.

person a_horse_with_no_name    schedule 13.12.2010
comment
getResource() должен содержать параметр (String). - person Poru; 14.12.2010
comment
Хорошо, это возвращает правильный путь к файлу, но в пути есть ошибка: путь содержит пробел, поэтому внутри пути есть %20, который Java говорит, что такого файла нет, но он есть !? - person Poru; 14.12.2010
comment
Вам нужно использовать URLDecoder, чтобы получить настоящее имя файла. я отредактировал свой ответ - person a_horse_with_no_name; 14.12.2010

Я бы посоветовал вам добавить строку, чтобы она говорила что-то по строкам (непроверено):

File f = new File(....);
System.out.println("f=" + f.getAbsolutePath());
// do stuff with f

Это скажет вам, где именно ожидается файл, и позволит вам выяснить, что именно происходит.

person Thorbjørn Ravn Andersen    schedule 13.12.2010
comment
Он возвращает корневую папку всего проекта (внутри находятся такие папки, как build, src, dist и т. д.). - person Poru; 14.12.2010
comment
Если я установлю build\\classes\\project\\file.xml как путь, он сработает?! - person Poru; 14.12.2010
comment
Это потому, что текущим рабочим каталогом по умолчанию для новой конфигурации запуска является корень проекта. Попробуйте еще раз, используя метод getResource(). - person Thorbjørn Ravn Andersen; 14.12.2010

Иногда вам может понадобиться добавить дополнительный / впереди

File file = new File(this.getClass().getClassLoader().getResource("/file.xml").getFile());
person npinti    schedule 13.12.2010
comment
Почему / будет специфичным для Windows? - person a_horse_with_no_name; 14.12.2010
comment
Это говорит о том, что его можно найти в root пути к классам, а не относительно исходного ресурса. - person Thorbjørn Ravn Andersen; 14.12.2010
comment
Странно, я мог бы поклясться, что был комментарий, в котором говорилось, что / сделает эту Windows специфичной (что-то, например, не делайте этого, это заставит это работать только в Windows). - person a_horse_with_no_name; 14.12.2010