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

时间:2014-02-12 14:00:04

标签: java io

假设以下资源位于类路径中:

/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()建议的解决方案,则可以使用。

我认为这个黑客会起作用。我不确定我是否会在实际代码中使用它! ; - )

5 个答案:

答案 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