5

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
4

3 に答える 3

4

getResourceAsStreamパスの URL を作成するよう ClassLoader に要求します。末尾に空の文字列または空白があるパスは、クラスの .class ファイルが存在するファイルのディレクトリを指しているため、FileURLConnectionオブジェクトが構築されます。getResourceAsStream次に、そのオブジェクトに要求しgetInpuStream()、実装はソートされたディレクトリ リストを文字列に作成し、デフォルトのロケールに従ってバイトに変換し、ByteArrayInputStreamこれらのバイトを返します。

FileURLConnections の動作は十分に文書化されていませんが、検索すると...

于 2012-07-13T16:57:01.827 に答える
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 に答える
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 に答える