我需要从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引用而不在某个地方创建临时文件?如果可以的话,在某个地方创建一个临时文件会很骇人吗?