首先:
我知道,这个问题已被问过100次了。 我知道,有人已经给出了正确的答案。
但无论如何,我不得不再问这个问题。我找不到适合我的解决方案。遗憾。
我正在用java编写游戏。当然我有很多带声音和图片的包(文件夹)等等。但是这些文件夹都是可变大小的。所以我想在列表中动态保存这样一个文件夹的内容。
通常,我这样做:
File f[] = new File(getClass.getResource("/home/res/").toURI()).listFiles();
现在我可以迭代这个文件对象并保存每个文件。完善。真?
没有。当我将此项目提取到jar存档时,这会失败。所有这些都是因为uri不是“等级”或类似的东西。见这个例外:
C:\Users\Administrator\Desktop>java -jar Homework.jar
java.lang.IllegalArgumentException: URI is not hierarchical
at java.io.File.<init>(Unknown Source)
at homework.moonface.src.Moonface.loadSounds(Moonface.java:94)
at homework.moonface.src.Moonface.<init>(Moonface.java:55)
at control.Overview.main(Overview.java:16)
好的,我想,所以我需要获取此路径并将其手动添加到文件对象中。 (新文件(“路径”);但是......这不起作用。我收到输入未正确写入的已知错误,或者当我尝试从资源URL剪切“file:”时,它打破了因为在jar中它的“jar:file:”而不是“file:”。但是如果我剪切jar:file:我得到null。
所以,请不要将此标记为副本,并尽快为我解释。这将有助于其他千万不了解其他不是解决方案的解决方案。
答案 0 :(得分:1)
试试这个:
URL jarResourceURL = getClass().getResource("/home/res/");
JarURLConnection jarURLConnection = (JarURLConnection) jarResourceURL.openConnection();
Enumeration<JarEntry> entries = jarURLConnection.getJarFile().entries();
while (entries.hasMoreElements()){
entries.nextElement(); // iterate over entries and do something
}
UPD:我在考虑Spring框架ClassPathXmlApplicationContext
如何从jar中解析资源。所以我调查了源代码并且有一个实用程序类org.springframework.core.io.ClassPathResource
,它有一个方便的接口(而且有可能使用它来获取相应的java.io.File
实例)并且可以帮助你解决问题。这是文档:
http://docs.spring.io/spring/docs/2.5.x/api/org/springframework/core/io/ClassPathResource.html