2012-07-13 54 views
5

我只是遇到了getResourceAsInputStream的一些特殊行为,我希望有人可以阐明一些。为什么带有空字符串的getResourceAsStream返回一个空的InputStream?

通过这种方法,不存在的资源的名称返回null,就像我所期望的那样。但是,传递一个空的或空间填充的字符串实际上会返回一个有效的InputStream,其中包含零个字节。只有空的或空间填充的字符串似乎这样做;像“\ t”或“\ n”这样的空格将导致null。

这是预期的行为?如果是这样,它的目的是什么?

this.class.getResourceAsStream("no_such_resource"); // returns null 
this.class.getResourceAsStream("");     // returns an InputStream 
this.class.getResourceAsStream(" ");    // returns an InputStream 
this.class.getResourceAsStream("\t");    // returns null 

回答

3

getResourceAsStream要求ClassLoader构造路径的URL。末尾为空字符串或空白的路径指向类.class文件所在文件的目录,因此它将构造一个FileURLConnection对象。 getResourceAsStream反过来要求该对象为getInpuStream(),并且该实现会在字符串中建立一个已排序的目录列表,根据默认语言环境将其转换为字节,并为这些字节提供一个ByteArrayInputStream

FileURLConnections行为是不是很好的记录,但如果你的搜索...

+1

很好的解释!值得注意的是,这是'FileURLConnection'的一个怪癖,它不被'JarURLConnection'共享;运行完全相同的代码,但将这些类打包到一个jar中,将不会生成列表(至少根据我的测试)。 – 2012-07-13 17:02:42

+0

啊哈,这很有道理!感谢您的解释。 – 2012-07-13 17:41:50

4

试试这个代码:

InputStream is = this.class.getResourceAsStream(""); 
BufferedReader br = new BufferedReader(new InputStreamReader(is)); 
String line; 
while((line = br.readLine()) != null) System.out.println(line); 
br.close(); 

会打印出的是位于当前类的同一目录类的列表。例如:

a.class 
CallablePrintTask.class 
java.policy.applet 
RunnablePrintTask.class 
ZoomableImageFrame.class 
ZoomableImageFrame$FlagHolder.class 
ZoomableImageFrame$ImageViewer.class 
ZoomableImageFrame$LoadAction.class 
ZoomableImageFrame$LoadAction$1.class 
ZoomableImageFrame$ScaleAction.class 
+0

发生了什么事情的好例证。我假设我得到一个空流而不是像这样的结果与在Groovy控制台中测试我的假设有关... – 2012-07-13 17:43:08

0

我的猜测是:

this.class.getResourceAsStream("no_such_resource"); // returns null 
this.class.getResourceAsStream("");     // returns an InputStream 
this.class.getResourceAsStream(" ");    // returns an InputStream 
this.class.getResourceAsStream("\t"); 

getResourceAsStream("c:\t") < - 是有效的。

巧合的是,\t是制表符。然而,将它作为查找的途径是完全有效的。

+0

我不这么认为。为了生成一个有效的反斜线分隔的Java String,你必须避开反斜杠。换句话说,你必须这样做'getResourceAsStream(“c:\\ t”)''。它与制表符完全不同。 – Stewart 2013-08-14 22:37:33

相关问题