【问题标题】:Load all files from directory using .getClassLoader().getResource()使用 .getClassLoader().getResource() 从目录加载所有文件
【发布时间】:2012-01-17 05:54:25
【问题描述】:

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

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

【问题讨论】:

    标签: java resources path classloader getresource


    【解决方案1】:

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

    不幸的是,如果不使用一些额外的库,这些库会利用一些技巧来实现这一点,那么没有一种好的方法可以完全按照您的要求进行操作。类路径上的资源不是可枚举的,因为无法保证它们从哪里加载(可能来自磁盘、JAR 文件、HTTP、数据库或其他外来资源 - 包括可用文件枚举的资源)是不可行的)。最好的方法是包含一个“索引”或其他具有众所周知名称的类似文件,可以参考这些文件来查找您感兴趣的其他资源。

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

    【讨论】:

    • 我确定这些文件(xml 文件)将在 JAR 中。我会尝试使用 JarFile。
    【解决方案2】:
    .getClassLoader().getResource("otherresources")
    

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

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

    【讨论】:

      猜你喜欢
      • 2011-04-17
      • 2010-10-12
      • 1970-01-01
      • 1970-01-01
      • 2010-10-17
      • 2020-07-17
      • 2014-11-08
      • 2023-03-31
      • 1970-01-01
      相关资源
      最近更新 更多