2016-07-20 1 views
0

КодGetResource с Google IO файлов приводит к FileNotFoundException для файла из баночки корня

Files.toString(new File(Thread.currentThread().getContextClassLoader().getResource(
    "login_commands.json").getFile()), Charsets.UTF_8) 

Исключение

java.io.FileNotFoundException: file:\C:\application\target.jar!\login_commands.json (The filename, directory name, or volume label syntax is incorrect) 

Jar структура

- корень

  • login_commands.json
  • и т.д.

Код хорошо работает с IDE.

Как читать этот файл?

ответ

1

Решение

Использование

Thread.currentThread().getContextClassLoader().getResourceAsStream("login_commands.json") 

Insteed из

Thread.currentThread().getContextClassLoader().getResource("login_commands.json").getFile() 

Почему?

При использовании getResource(), тем загрузчик классов попытаться получить файл из <JAR_FOLDER>/YOUR_JAR.jar!login_commands.json и этот путь не является допустимым для создания java.io.File и бросает FileNotFoundException

Обратите внимание, что ваш код работает в IDE, потому что ваш IDE есть его ownClassloader что, когда вы вызываете getResource или getResourceAsStream, получите файл от workspace/test/target/classes/login_commands.json, который является допустимым путем для создания файла.