Как исправить FileNotFoundException для файлового ресурса jav jar? - PullRequest
3 голосов
/ 04 апреля 2019

Мне нужно прочитать zip-файл из моего jar-файла, чтобы я мог передать его конструктору OpenOfficeSpellDictionary.Поскольку файл словаря .zip находится внутри файла jar, я не могу создать новую ссылку на файл с URI, как я могу, когда файл находится за пределами файла jar.Кажется, правильный способ загрузки ресурса внутри jar-файла - это InputStream, но мне нужно передать файл конструктору OpenOfficeSpellDictionary.
Код теперь выглядит следующим образом:

public static SpellDictionary forLanguage( MyLanguage lang ){
       String dictName = (String) props.get(lang.getLocale().getLanguage());
       if ( dictName != null ){
           if ( dicts.containsKey(lang) )
               return dicts.get(lang);
           System.out.println("loading dictionary for : " + lang);
           URL url = Dictionaries.class.getClassLoader().getResource(dictName);
           System.out.println(url);  //prints null
           try {
               System.out.println("loading dictionary for dictname : " + dictName);
               File zip = new File(url.toURI());
               OpenOfficeSpellDictionary dict = new OpenOfficeSpellDictionary(
                       new ZipFile(zip)
                       );
               dicts.put( lang, dict );

               return dict;
           } catch (Exception e){
               e.printStackTrace();
               dicts.put( lang, null );
           }
       }else{
           System.out.println("dictname is null " );            
       }
       return null;
   }

и печатаетout:

loading dictionary for : English
null
loading dictionary for dictname : dict/en_US.zip
java.lang.NullPointerException
    at org.jl.nwn.spell.Dictionaries.forLanguage(Dictionaries.java:58)

или иногда, когда я использую немного другой URI:

java.io.FileNotFoundException: jar:file:/Users/myname/Dev/MyProject/myjar.jar!/resource/dict/en_US.zip (No such file or directory)

Я попытался использовать для dictName строки /dict/en_US.zip, dict / en_US.zip, resource / dict / en_US.zip и /resource/dict/en_US.zip безрезультатно.Вызов

InputStream is = Dictionaries.class.getClassLoader().getResourceAsStream(
                    "resource/dict/dictionaries.properties"); 

работает, когда я пытаюсь загрузить реквизиты.

Могу ли я превратить InputStream в ссылку File внутри jar-файла без создания временного файла где-нибудь?Будет ли создание временного файла где-то ужасно взломанным, если я смогу?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...