【问题标题】:Can't getResourcesAsStream() from a folder (in a jar)无法从文件夹(在 jar 中)中获取 ResourcesAsStream()
【发布时间】:2014-12-28 13:57:49
【问题描述】:

我有一个问题,我想列出“默认”文件夹中的文件,这个文件夹在资源文件夹中:

-resources/languages/default/manyfiles

第二行抛出 nullPointerException

InputStream in = getClass().getClassLoader().getResourceAsStream("languages/default/");
BufferedReader br = new BufferedReader(new InputStreamReader(in));

似乎我不能对文件夹执行此操作,而只能对文件执行此操作。问题是我不能使用 File,因为它在 jar 中。

编辑:这里是 jar 的内容: http://www.mediafire.com/view/05u5w20xupt1mo1/javapbfolder.bmp

【问题讨论】:

  • 路径是否正确?如果你有一个 URLClassLoader 实例,你通常会这样做,那么 getResourceAsStream 应该返回文件夹中的项目。
  • 您试图将 目录 作为流请求...这没有任何意义,无论它是在 jar 文件中还是在文件系统中。跨度>
  • @JonSkeet 实际上 NIO.2 API 为目录提供了 DirectoryStream 和 java.util.stream.Stream ,AFAIK。不过,如果我没记错的话,两者都与 java.io 流不同。
  • @Puce:完全正确 - InputStream 在这里没有任何意义。

标签: java jar stream resources


【解决方案1】:

没有列出文件夹内容的标准方法。原因是类资源加载背后存在文件系统的概念,只是资源的名称/位置。

这取决于你想做什么,如何解决这个问题。我想到了可能的解决方案:

  1. 从目录中的一个资源中检索 URL。从 URL 中提取 JAR 文件并通过 ZipFile 类打开 JAR。这是“hacky”,可能会也可能不会,具体取决于您运行的平台和安全设置。

  2. 在打包包含资源列表的 JAR 时生成索引文件。

  3. 将 JAR 放入资源中,然后通过 ZipFile 打开。

【讨论】:

  • 我想我会尝试第二种解决方案,这似乎是最干净的方式。
  • 当您说“打包 JAR 时生成索引文件”时,有没有办法自动执行?
  • 注意:使用 NIO.2 File API 和 zip 文件系统提供程序,读取 jars 甚至列出 jars 中的 dirs 内容比手动使用 ZipFile 简单得多。
  • 即使使用 nio 目录流我也无法列出文件夹的内容
猜你喜欢
  • 1970-01-01
  • 2011-10-11
  • 2015-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多