使用.getClassLoader()从目录加载所有文件.getResource()

时间:2011-12-10 02:33:54

标签: java resources path classloader getresource

在我的一个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文件中没有按预期工作有关。

有关如何解决此问题的任何提示?

2 个答案:

答案 0 :(得分:5)

正确,File API只能从文件系统读取,而不能读取JAR文件。

不幸的是,没有一种好的方法可以完全按照你要做的去做,而不使用一些额外的库来利用一些黑客来试图完成这一点。类路径上的资源并不是可枚举的,因为无法保证从哪里加载它们(可能来自磁盘,JAR文件,HTTP,数据库或其他外来资源 - 包括可用文件枚举的资源)不可行)。最好的方法是包含一个“索引”或其他具有众所周知名称的类似文件,可以参考这些文件来查找您感兴趣的其他资源。

如果您知道JAR文件的路径,那么其中一个“黑客”就是,您可以使用JarFile(甚至只是ZipFile)来阅读它们。

答案 1 :(得分:3)

.getClassLoader().getResource("otherresources")

未经测试。获得“目录”后,请使用它来返回存档本身。

当然,我通常建议在制作档案时创建目标资源列表,然后将该列表包含在档案中的已知位置。但上述内容可能足以满足此用例。