我需要从Jar中访问配置文件,所以我使用:
URL configUrl = Object.class.getResource("/config.xml");
现在我需要将URL转换为File对象,因为这是下游ConfigurationFile对象初始化所需要的。当我尝试这个时:
new File(configUrl.toURI())
我明白了:
java.lang.IllegalArgumentException: URI is not hierarchical
当我尝试这个时:
new File(Thread.currentThread().getContextClassLoader().getResource("config.xml").getFile())
我明白了:
File does not exist: 'file:\E:\Apps\jarfile.jar!\config.xml'
注意:不幸的是,我必须在InputStream上有一个File对象。
答案 0 :(得分:2)
你的问题没有意义。资源可能位于JAR文件中,JAR文件中的项目不是文件,或File.
周期。
如果您需要File
对象,则必须从JAR文件中单独分发该项目。
答案 1 :(得分:2)
如果文件在JAR内...你可以使用getResourceAsStream()并直接读取或使用URL ...
URL urlConfig = Object.class.getResource(CONFIG_FILE);
if (urlConfig == null) {
// throw <error>
}
URLConnection connConfig = urlConfig.openConnection();
InputStream isConfig = connConfig.getInputStream(); // do things
将内容保存到临时文件...(等待1秒...... mmm)
public static File doThing(InputStream is) throws IOException {
File tmp = null;
FileOutputStream tmpOs = null;
try {
tmp = File.createTempFile("xml", "tmp");
tmpOs = new FileOutputStream(tmp);
int len = -1;
byte[] b = new byte[4096];
while ((len = is.read(b)) != -1) {
tmpOs.write(b, 0, len);
}
} finally {
try { is.close(); } catch (Exception e) {}
try { tmpOs.close(); } catch (Exception e) {}
}
return tmp;
}
答案 2 :(得分:-3)
你试过这个:
File f; try { f = new File(url.toURI()); } catch(URISyntaxException e) { f = new File(url.getPath()); }