假设以下资源位于类路径中:
/res/image/logo.png
/res/image/splash.png
然后可以使用以下方式获取InputStream
logo.png:
SomeClass.class.getResourceAsStream("/res/image/logo.png");
如果您要求的资源不存在,getResourceAsStream()
将返回null。
但是,如果您要求的资源确实是一个目录,那么您不会得到null或异常:您实际上得到的是java.io.ByteArrayInputStream
。转储此流中的字节后,它似乎是该目录中资源的列表(每行一个)。
所以:
SomeClass.class.getResourceAsStream("/res/image");
提供ByteArrayInputStream
转储时包含:{/ p>
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()
建议的解决方案,则可以使用。
我认为这个黑客会起作用。我不确定我是否会在实际代码中使用它! ; - )
答案 0 :(得分:1)
getResource()提供一个URL。检查该URL,如果以“file://”开头,则可以提取文件名,然后调用new File(name).isDirectory()
。
如果它不以“file://”开头,则它位于Web服务器后面,并且没有标准方法来确定资源是否是目录。
附录
尝试添加“/”。或“/ ..”到URL - 如果表示的资源存在,则URL引用目录。
答案 1 :(得分:1)
测试null
作为目录的非getResource()
结果非常简单:只需检查其path是否以"/"
结尾(斜杠)。
如果您不信任这种简单的检查,则必须单独执行每个协议的检查。对于file:
网址,有一种安全的方式:
URL url = Foo.class.getResource(".");
if(url.getProtocol().equals("file"))
{
boolean dir=new File(url.toURI()).isDirectory();
}
对于其他人来说,情况并不那么明显。有些协议甚至可能没有目录的概念(或文件和目录之间的区别)。对于JAR
文件,您通常会获得null
,因为通常JAR
个文件不包含目录条目。
答案 2 :(得分:0)
据我所知,getResourceAsStream没办法,但是你可以通过getResource
获取URL来检查它是否是文件或目录,然后获取路径new File(path).isDirectory()
和{{ 1}}
答案 3 :(得分:0)
你可以这样做:
URL resource = getClass().getResource("/res/image");
File folder = new File(new URI(resource.getPath()).getPath());
if(folder.isDirectory()) {
// do something
}
答案 4 :(得分:0)
您可以通过它的类检测InputStream
是文件还是目录。如果它是一个文件,它将是一个&#34; BufferedInputStream&#34;目录将是&#34; ByteArrayInputStream&#34;。
public boolean isDirectory(InputStream is) {
return is.getClass().getSimpleName().equals("ByteArrayInputStream");
}
public boolean isFile(InputStream is) {
return is.getClass().getSimpleName().equals("BufferedInputStream");
}
例如:
InputStream is = SomeClass.class.getResourceAsStream("/res/image");
boolean isDirectory = isDirectory(is); //true