Почему я получаю FileNotFoundException, когда ClassLoader.getSystemRessource(имя файла) дает результат?

Моему текущему приложению необходимо получить данные из файла для инициализации его атрибутов. Его необходимо сохранить в файле, чтобы пользователь мог изменять его.

String strFile = ClassLoader.getSystemResource("myFile.csv").getPath();
if(strFile==null)
        throw new Exception("File not find");
BufferedReader br = new BufferedReader(new FileReader(strFile));
//Begin reading file process..

Моя проблема в том, что strFile не равно нулю, но у меня возникает java.io.FileNotFoundException при инициализации br, см. следующий стек:

java.io.FileNotFoundException: C:\Users\TH951S\My%20Documents\Eclipse\Workspace
                                 \My%20App\bin\myFile.csv 
                                 (The system cannot find the path specified)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(Unknown Source)
at java.io.FileInputStream.<init>(Unknown Source)
at java.io.FileReader.<init>(Unknown Source)

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

Кто-нибудь знает, почему это происходит? Или есть другой способ получить файл, когда путь неизвестен?

Спасибо за чтение и больше за ответ,


person ArtiBucco    schedule 05.07.2012    source источник


Ответы (2)


Я решаю свою проблему, одну из тех, что заставляет вас чувствовать себя глупо из-за того, что вы не решили ее раньше.

URL-адреса представляют собой пробелы кодирования со значением %20, и Java не заменяет значение символом пробела при инициализации FileReader. Поэтому необходимо заменить %20 на " ".

Есть и другой способ противодействия этому. Также возможно инициализировать BufferedReader с помощью InputStreamReader следующим образом:

InputStream in=ClassLoader.getSystemResourceAsStream("myFile.csv");
BufferedReader br = new BufferedReader(new InputStreamReader(in));
person ArtiBucco    schedule 05.07.2012

Просто для полноты: я боролся с той же проблемой, но результатом должен был быть объект File (потому что мне нужен был размер файла).

URL url = ClassLoader.getSystemResource("myFile.csv");
File file = new File(url.toURI());
System.out.println("Correct path: " + file.getAbsolutePath());
System.out.println("Size of file: " + file.length());

Решение основано на проблеме sysLoader.getResource() в java.

Я был удивлен, что мне пришлось пройти так много классов, но я не нашел более близкого решения.

person Daniel Alder    schedule 22.10.2015