2012-06-06 22 views
8

Tôi đã thấy một số câu trả lời liên quan đến cách tải một tệp cụ thể trong một cái bình qua getResourceAsStream và tôi có thể quản lý việc này. Tuy nhiên tôi đang đối mặt với một cái gì đó thực sự cụ thể, tôi không thể tìm thấy câu trả lời về điều này trên diễn đàn.Đang tải với ResourceBundle từ bên trong một cái bình

Dưới đây là cấu hình:

Tôi có một file jar có một conf thư mục chứa 2 thuộc tính tập tin messages_en_US.propertiesmessages_fr_FR.properties. Cách cổ điển để tải các tài nguyên đó là sử dụng

ResourceBundle.getBundle("messages", java.util.Locale.getDefault()); 

Nếu các tệp trên đĩa, trong thư mục được tham chiếu bởi đường dẫn lớp chương trình, điều này có tác dụng. Nhưng tôi không biết làm thế nào tôi có thể quản lý kết hợp sử dụng ResourceBundle.getBundle và sử dụng tài nguyên từ witin một cái bình. Thật vậy, vì tôi không thể nhìn thấy bất kỳ cây cầu nào qua getResourceAsStream (hoặc điều này có nghĩa là tự quản lý miền địa phương để chỉ định toàn bộ tên tệp tài nguyên, không phải là rất thông minh).

Có ai giúp được không?

Cảm ơn.

+0

Nơi nào bạn có tập tin đó trong cái lọ? nếu nó nằm trong một JAR có nghĩa là bạn có nó trong classpath và bạn không nên có vấn đề để tải nó bình thường với ResourceBundle.getBundle – rascio

+0

Tôi có cùng một vấn đề, tôi có một tài sản thuộc tính bên trong một tệp jar nhưng tệp jar đó KHÔNG trong classpath của chương trình.Tôi đọc javadoc cho PropertyResourceBundle và tôi biết tôi có thể làm điều đó với inputstream nhưng inputstream có nghĩa là IO nó sẽ đọc tập tin mọi lúc và tôi mất mặc định ResourceBundle caching. Có cách nào để chỉ đạo lớp ResourceBundle để lấy gói từ một tài nguyên nằm ngoài classpath của nó không? –

+0

Ngoài ra ResourceBundle.Control có thể được thực hiện để tùy chỉnh nhưng có vẻ là một quá mức cần thiết, tốt hơn để tìm cách để đặt các tập tin thuộc tính trong classpath này. –

Trả lời

1

Bạn đã thử cái này chưa?

ResourceBundle.getBundle("conf/messages", java.util.Locale.getDefault()); 
10

Nếu đó là trong một thư mục conf bên trong lọ, sau đó gói của gói bạn đang cố gắng để tải là conf, và bạn nên sử dụng

ResourceBundle.getBundle("conf.messages", java.util.Locale.getDefault()); 

The javadoc nói:

baseName - the base name of the resource bundle, a fully qualified class name 
+0

3+ giờ và cuối cùng câu trả lời này đã cứu mạng tôi. +1 – xyz

+0

Tệp JAR không có nghĩa là tệp phải nằm trong đường dẫn lớp. Tôi nghĩ tác giả ban đầu đang cố gắng nói cách truy cập gói tài nguyên khi ở bên ngoài đường dẫn lớp. Một cách là sử dụng PropertyResourceBundle với InputStream nhưng sau đó bạn mất bộ nhớ đệm và bất cứ lúc nào bạn làm bó, bạn phải thực hiện một gói mới. Tôi có cùng một vấn đề, tôi có một tài nguyên không có trong classpath. –

0

ResourceBundle luôn tìm kiếm tệp thuộc tính, vì vậy, nếu bạn chạy:

ResourceBundle.getBundle("messages", java.util.Locale.getDefault()); 

ResourceBundle sẽ tìm kiếm "messages.properties" trong đường dẫn lớp của bạn.

0

Giả sử tệp tin.properties là một phần của một số xyz.jar đã có trên classpath của dự án mà bạn muốn sử dụng. Bao bì của tệp này trong jar như sau:

src 
    |main 
     |resources 
      |com 
       |xyz 
        ....|message.properties 

Để đọc tập tin này:

import java.util.ResourceBundle; 

....

ResourceBundle.getBundle("com.xyz.resources.messages", Locale.getDefault()); 

Cảm ơn