在我的一个JUnit测试中,我试图加载目录中包含的所有文件。我使用.getClassLoader().getResource("otherresources")
来查找目录。然后我做了一个新的java.io.File
。然后我使用listFiles()
获取所有子文件,然后再次使用.getClassLoader().getResource()
加载每个文件。
URL url = FileLoadTest.class.getClassLoader().getResource("otherresources");
File directory = new File(url.getPath());
File[] files = directory.listFiles();
基本上,我希望能够加载目录中的所有文件而不确切知道它们是什么。
我可以在Eclipse中正确运行测试。当我使用Maven(mvn install
)构建项目或使用surefire(mvn -Dtest=FileTest test
)单独运行测试用例时,测试用例失败并显示NullPointerException
。我认为这个问题与File api在资源部署到的JAR文件中没有按预期工作有关。
有关如何解决此问题的任何提示?
答案 0 :(得分:5)
正确,File API只能从文件系统读取,而不能读取JAR文件。
不幸的是,没有一种好的方法可以完全按照你要做的去做,而不使用一些额外的库来利用一些黑客来试图完成这一点。类路径上的资源并不是可枚举的,因为无法保证从哪里加载它们(可能来自磁盘,JAR文件,HTTP,数据库或其他外来资源 - 包括可用文件枚举的资源)不可行)。最好的方法是包含一个“索引”或其他具有众所周知名称的类似文件,可以参考这些文件来查找您感兴趣的其他资源。
如果您知道JAR文件的路径,那么其中一个“黑客”就是,您可以使用JarFile
(甚至只是ZipFile
)来阅读它们。
答案 1 :(得分:3)
.getClassLoader().getResource("otherresources")
未经测试。获得“目录”后,请使用它来返回存档本身。
ZipInputStream
。getNextEntry()
直到null
,并将符合所需位置的条目添加到可展开的列表中(例如ArrayList
)。ZipEntry.getName()
当然,我通常建议在制作档案时创建目标资源列表,然后将该列表包含在档案中的已知位置。但上述内容可能足以满足此用例。