2012-07-13 40 views
5

Tôi vừa gặp một số hành vi đặc biệt với getResourceAsInputStream mà tôi đã hy vọng một người nào đó có thể làm sáng tỏ.Tại sao getResourceAsStream với một chuỗi rỗng trả về một InputStream trống?

Chuyển phương thức này tên của tài nguyên không tồn tại trả về null, như tôi mong đợi. Tuy nhiên, truyền cho nó một chuỗi rỗng hoặc không gian thực sự trả về một InputStream hợp lệ với 0 byte trong đó. Chỉ các chuỗi rỗng hoặc không gian dường như làm điều này; khoảng trắng như "\ t" hoặc "\ n" sẽ dẫn đến một giá trị rỗng.

Hành vi này có dự định không? Nếu vậy, mục đích của nó là gì?

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 

Trả lời

3

getResourceAsStream yêu cầu ClassLoader tạo URL cho đường dẫn. Đường dẫn với một chuỗi rỗng hoặc khoảng trống ở điểm kết thúc đến thư mục của các tệp nơi lớp của bạn .class tệp nằm, do đó, nó xây dựng một đối tượng FileURLConnection. getResourceAsStream lần lượt yêu cầu đối tượng đó getInpuStream() và triển khai xây dựng danh sách thư mục được sắp xếp trong một chuỗi, chuyển đổi nó thành byte theo ngôn ngữ mặc định và cung cấp cho bạn ByteArrayInputStream trên các byte này.

FileURLConnections hành vi không phải là rất tốt tài liệu, nhưng nếu tìm kiếm của bạn ...

+1

Giải thích tuyệt vời! Cần lưu ý rằng đây là một điều không thích hợp của 'FileURLConnection' mà không được chia sẻ bởi' JarURLConnection'; chạy chính xác cùng một mã, nhưng với các lớp được đóng gói trong một cái lọ, sẽ không tạo ra một danh sách (theo các bài kiểm tra của tôi, ít nhất). –

+0

Aha, điều đó có ý nghĩa! Cảm ơn lời giải thích. –

4

Hãy thử mã này:

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(); 

này sẽ in một danh sách các lớp được đặt trong cùng thư mục của lớp hiện hành. Ví dụ:

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

Minh họa tốt về những gì đang diễn ra. Tôi cho rằng lý do tôi nhận được một luồng trống thay vì kết quả như thế này có liên quan đến việc thử nghiệm các giả thuyết của tôi trong bảng điều khiển Groovy .... –

0

tôi đoán là như sau:

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") < - là hợp lệ.

Điều trùng hợp là \t là ký tự tab. Tuy nhiên, nó là hoàn toàn hợp lệ để có đó là một con đường để tìm kiếm.

+0

Tôi không nghĩ vậy. Để tạo một chuỗi Java hợp lệ của một đường dẫn dấu gạch chéo ngược, bạn phải thoát khỏi các dấu gạch chéo ngược. Nói cách khác, bạn phải làm điều này 'getResourceAsStream (" c: \\ t ")'. Nó không giống như một nhân vật tab cả. – Stewart

Các vấn đề liên quan