java - 检测 java.lang.Class.getResourceAsStream() 打开的目录

标签 java io

假设以下资源在类路径中:

/res/image/logo.png
/res/image/splash.png

然后可以使用以下方法为 logo.png 获取 InputStream:

SomeClass.class.getResourceAsStream("/res/image/logo.png");

如果您请求不存在的资源,getResourceAsStream() 返回 null。

但是,如果您请求的资源实际上是一个目录,则不会得到 null 或异常:您实际上会得到一个 java.io.ByteArrayInputStream。从该流中转储字节后,它似乎是该目录中资源的列表(每行一个)。

所以:

SomeClass.class.getResourceAsStream("/res/image");

给出一个 ByteArrayInputStream,当转储时它包含:

logo.png
splash.png

是否有一种可靠的方法来确定 getResourceAsStream() 打开的资源确实是一个目录?或者其他一些访问类路径资源的方式,这样这是可能的? (可以用 getResource() 以某种方式完成吗?)

更新:

出于兴趣,我调用了 getResource() 并将我知道不存在的“资源”的 URL 转储为磁盘上的文件(在本例中为 /java/util/List.class).这是我得到的:

jar:file:/C:/projects/<my_proj>/env/jdk/jre/lib/rt.jar!/java/util/List.class

但是对于 /java/util 我得到了:

null

所以 null 可以被视为(公认的间接的,也许不可靠)指示“资源”是一个目录如果资源的 URL 不是'文件:'资源。如果是建议使用 File.isDirectory() 的解决方案,则可以使用。

我认为这个 hack 会奏效。我不确定我是否会在实际代码中实际使用它! ;-)

最佳答案

测试 getResource() 的非null 结果是否是目录非常简单:只需检查它是否为 path"/"(斜杠)结尾。

如果您不信任这个简单的检查,您将不得不对每个协议(protocol)单独实现检查。对于 file: URL,有一种安全的方法:

URL url = Foo.class.getResource(".");
if(url.getProtocol().equals("file"))
{
  boolean dir=new File(url.toURI()).isDirectory();
}

对于其他人来说并不是那么明显。某些协议(protocol)甚至可能没有目录的概念(或文件和目录之间的区别)。对于 JAR 文件,您通常会得到一个 null,因为通常 JAR 文件不包含目录条目。

关于java - 检测 java.lang.Class.getResourceAsStream() 打开的目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21730059/

相关文章:

java - 具有元素数量限制的 Groovy .collect

java - 使用 `maven-assembly-plugin` 时,如何使用 Maven 将所有依赖项和我的 Java 项目文件捆绑到输出 jar 中?

java - HashMap 的多个实例

Java - 索引越界异常 : Index: 1, 大小:2

c - 删除换行符

java - 如何从文件中读取ArrayLists列表?

java读取并写入\u05DC为 '?'

c - C 编程中的 Hex 文件读取?

c++ - 为什么要使用 char 数组来存储以二进制模式打开的文件的内容?

使用 fopen 创建文件,但文件未出现在驱动器上