2012-07-13 76 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

相關問題