2011-01-24 30 views
10

Tôi gặp vấn đề lớn khi làm điều gì đó thực sự ngu ngốc. Đó là để nói mở một dòng vào một tập tin tài nguyên trong thư mục META-INF của tôi. Tôi đang làm việc trên một công cụ lọ và làm việc này:không thể đọc tệp từ META-INF

InputStream schemaIS = this.getClass().getClassLoader().getResourceAsStream("/META-INF/schema.xsd"); 

Tôi chỉ đơn giản là có được một giá trị rỗng! Dự án được xây dựng bằng cách sử dụng maven và tệp xsd kết thúc trong thư mục META-INF, nhưng nó vẫn không hoạt động.

Điều tôi không hiểu là lý thuyết đằng sau nó? Làm thế nào để ClassLoader thực hiện tra cứu trong hệ thống tập tin? Làm thế nào để tôi có được bàn tay của tôi trên tập tin?

+3

nó là một ứng dụng web? – Bozho

Trả lời

23

Cố gắng loại bỏ dấu gạch chéo đầu tiên:

InputStream schemaIS = this.getClass().getClassLoader().getResourceAsStream("META-INF/schema.xsd"); 

Bạn cần một dấu gạch chéo hàng đầu nếu bạn đang gọi phương thức getResourceAsStream trên một đối tượng Class. Trên đối tượng ClassLoader, đường dẫn luôn tuyệt đối và dấu gạch chéo hàng đầu là không cần thiết.

+0

nếu đó là một META-INF thông thường nằm trên thư mục gốc của đường dẫn lớp, thì dấu gạch chéo hàng đầu là cần thiết. – Bozho

+2

@Bozho dấu gạch chéo hàng đầu là cần thiết nếu bạn đang gọi phương thức getResourceAsStream trên một đối tượng Lớp, không phải trên một trình nạp lớp. – dogbane

+0

nó là _not_ cần thiết nếu gọi trên trình nạp lớp, nhưng chắc chắn không tạo sự khác biệt. Những gì 'class.gerResourceAsStream()' làm là để giải quyết đường dẫn tương đối với chính nó, và sau đó vượt qua nó để getResourceAsStream của trình nạp lớp của nó. – Bozho

2

thử con đường này: META-INF/schema.xsd (đầu tiên / bỏ qua)

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