3

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

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

4

2 回答 2

5

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

不幸的是,如果不使用一些额外的库来尝试实现这一点,那么没有一种好方法可以准确地完成您正在尝试做的事情。类路径上的资源不是可枚举的,因为无法保证它们从哪里加载(可能来自磁盘、JAR 文件、HTTP、数据库或其他外来资源 - 包括可用文件枚举的资源)是不可行的)。最好的方法是包含一个“索引”或其他具有知名名称的类似文件,可以参考这些文件来查找您感兴趣的其他资源。

这些“黑客”之一是,如果您知道 JAR 文件的路径,您可以使用JarFile(甚至只是ZipFile)从它们中读取。

于 2011-12-10T02:39:36.447 回答
3
.getClassLoader().getResource("otherresources")

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

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

于 2011-12-10T02:59:03.913 回答