Почему я не могу получить файл из ресурсов? - PullRequest
0 голосов
/ 27 февраля 2019

Почему я не могу получить файл из ресурсов?

URL resource = getClass().getClassLoader().getResource("input data/logic test.csv");
    System.out.println("Found "+resource);

    CSVParser parser = new CSVParserBuilder().withSeparator(';').build();
    CSVReader reader = new CSVReaderBuilder(new FileReader(resource.getFile())).withSkipLines(1).withCSVParser(parser).build();

Вывод на консоль:

Found file:/home/alexandr/Repos/OTUS/first_home_work/target/classes/input%20data/logic%20test.csv 

Exception in thread "main" java.io.FileNotFoundException: /home/alexandr/Repos/OTUS/first_home_work/target/classes/input%20data/logic%20test.csv (Нет такого файла или каталога)

Ответы [ 4 ]

0 голосов
/ 27 февраля 2019

В этой строке есть внутренняя логическая проблема:

CSVReader reader = new CSVReaderBuilder(
    new FileReader(resource.getFile()))..

Когда CSV является частью Jar, он больше не будет доступен как объект File.Но что-то вроде этого должно работать непосредственно для URL.

CSVReader reader = new CSVReaderBuilder(
    new InputStreamReader(resource.openStream()))..

изменить пространство для _ в имени каталога и имени файла и работает

Это будет работать, только если ресурс не вфайл Jar.

0 голосов
/ 27 февраля 2019

Это:

try (InputStream raw = ClassThisIn.class.getResourceAsStream(""input data/logic test.csv")) {
    InputStreamReader isr = new InputStreamReader(raw, StandardCharsets.UTF_8);
    BufferedReader br = new BufferedReader(isr);
    // now use br as if it was your filereader.
}

Это решает многие проблемы:

  1. По-прежнему работает независимо от того, как вы его выполняете: ваш фрагмент работает, только если он работает как файлы прямого класса (по сравнению, скажем, в банке), и не работает, если используются пробелы.
  2. По-прежнему работает, даже если ваш класс находится в подклассе (getClass().getClassLoader().getResource не будет, поэтому вы не должны этого делать).
  3. По-прежнему работает, даже если кодировка локальной кодировки платформы странная (фрагмент этого ответа явно говорит об этом. Это всегда хорошая идея).
  4. Нет утечки ресурсов,Ваш код никогда не закрывает читателя, который вы открываете.Если вы открываете ресурсы, сделайте это в конструкции try-with-resources или сохраните ресурс в поле и внедрите AutoClosable.
0 голосов
/ 27 февраля 2019

я меняю место для _ в имени каталога и имени файла, и работаю .... омг.

0 голосов
/ 27 февраля 2019

Ответ находится в выводе вашей консоли - файл просто не найден.Я хотел бы попробовать тот же код, который вы написали, но использовать файл без пробелов - и посмотреть, если файл все еще не найден.

...