为什么带有空字符串的getResourceAsStream返回一个空的InputStream?

时间:2012-07-13 16:29:40

标签: java

我刚刚遇到了getResourceAsInputStream的一些特殊行为,我希望有人可以说清楚。

传递此方法,不存在的资源的名称将返回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 个答案:

答案 0 :(得分: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

答案 1 :(得分:4)

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

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

答案 2 :(得分: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是制表符是巧合。然而,将它作为一种查找的途径是完全有效的。