如何修复Java Jar文件资源的FileNotFoundException?

时间:2019-04-04 07:01:16

标签: java jar

我需要从jar中读取一个zip文件,以便将其传递给OpenOfficeSpellDictionary构造函数。由于字典.zip文件位于jar文件内部,因此无法像jar外部一样使用URI创建新的File引用。似乎在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;
   }

并打印出来:

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"); 

在我尝试加载道具时起作用。

是否可以在一个jar文件中将InputStream转换为File引用而不在某个地方创建临时文件?如果可以的话,在某个地方创建一个临时文件会很骇人吗?

0 个答案:

没有答案