5

我刚刚遇到了 getResourceAsInputStream 的一些特殊行为,我希望有人能对此有所了解。

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

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

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
4

3 回答 3

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
于 2012-07-13T16:39:47.750 回答
4

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

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

于 2012-07-13T16:57:01.827 回答
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是制表符。然而,将其作为查找的路径是完全有效的。

于 2012-07-13T17:03:44.373 回答