假设以下资源在类路径中:
/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/