Đang tải tệp thuộc tính từ gói Java


115

Tôi cần đọc một tệp thuộc tính nằm trong cấu trúc gói của tôi com.al.common.email.templates.

Tôi đã thử tất cả mọi thứ và tôi không thể tìm ra nó.

Cuối cùng, mã của tôi sẽ chạy trong vùng chứa servlet, nhưng tôi không muốn phụ thuộc vào vùng chứa đó cho bất cứ thứ gì. Tôi viết các trường hợp thử nghiệm JUnit và nó cần hoạt động ở cả hai.

Câu trả lời:


235

Khi tải Thuộc tính từ một Lớp trong gói, com.al.common.email.templatesbạn có thể sử dụng

Properties prop = new Properties();
InputStream in = getClass().getResourceAsStream("foo.properties");
prop.load(in);
in.close();

(Thêm tất cả các xử lý ngoại lệ cần thiết).

Nếu lớp của bạn không nằm trong gói đó, bạn cần hỏi InputStream hơi khác một chút:

InputStream in = 
 getClass().getResourceAsStream("/com/al/common/email/templates/foo.properties");

Các đường dẫn tương đối (những đường dẫn không có '/' ở đầu) trong getResource()/ getResourceAsStream()có nghĩa là tài nguyên sẽ được tìm kiếm liên quan đến thư mục đại diện cho gói mà lớp đang ở trong đó.

Sử dụng java.lang.String.class.getResource("foo.txt")sẽ tìm kiếm tệp (không tồn tại) /java/lang/String/foo.txttrên classpath.

Sử dụng đường dẫn tuyệt đối (đường dẫn bắt đầu bằng '/') có nghĩa là gói hiện tại bị bỏ qua.


2
Đề xuất: Thêm giải thích khi nào sử dụng đường dẫn tương đối và khi nào sử dụng đường dẫn tuyệt đối (có và không có "/" ở đầu).
Aaron Digulla

1
điều gì sẽ xảy ra nếu tệp thuộc tính của bạn nằm ngoài thư mục src nhưng vẫn ở bên trong giám đốc dự án của bạn?
Jonathan

1
@jonney: Bản thân Java không có khái niệm về "thư mục dự án", một số IDE có thể có điều đó. Nhưng đối với Java thì nó chỉ đơn giản là một tệp ở đâu đó trên hệ thống tệp mà không liên quan gì đến classpath.
Joachim Sauer

50

Để thêm vào câu trả lời của Joachim Sauer, nếu bạn cần thực hiện điều này trong ngữ cảnh tĩnh, bạn có thể làm như sau:

static {
  Properties prop = new Properties();
  InputStream in = CurrentClassName.class.getResourceAsStream("foo.properties");
  prop.load(in);
  in.close()
}

(Xử lý ngoại lệ được giải quyết, như trước đây.)


Đây là câu trả lời phù hợp với tôi. Tôi không thể nhận được câu trả lời được chấp nhận để làm việc.
Steve HHH

1
@cobralibre cách đọc tệp thuộc tính nằm trong resourcesthư mục trong mavendự án
Kasun Siyambalapitiya

16

Hai trường hợp sau liên quan đến việc tải một tệp thuộc tính từ một lớp mẫu có tên TestLoadProperties.

Trường hợp 1: Đang tải tệp thuộc tính bằng ClassLoader

InputStream inputStream = TestLoadProperties.class.getClassLoader()
                          .getResourceAsStream("A.config");
properties.load(inputStream);

Trong trường hợp này, tệp thuộc tính phải nằm trong root/srcthư mục để tải thành công.

Trường hợp 2: Đang tải tệp thuộc tính mà không sử dụng ClassLoader

InputStream inputStream = getClass().getResourceAsStream("A.config");
properties.load(inputStream);

Trong trường hợp này, tệp thuộc tính phải nằm trong cùng thư mục với TestLoadProperties.classtệp để tải thành công.

Lưu ý: TestLoadProperties.javaTestLoadProperties.classlà hai tệp khác nhau. Cái trước, .javatệp, thường được tìm thấy trong src/thư mục của một dự án , trong khi cái sau, .classtệp, thường được tìm thấy trong bin/thư mục của nó .


12
public class Test{  
  static {
    loadProperties();
}
   static Properties prop;
   private static void loadProperties() {
    prop = new Properties();
    InputStream in = Test.class
            .getResourceAsStream("test.properties");
    try {
        prop.load(in);
        in.close();
    } catch (IOException e) {
        e.printStackTrace();
    }

}

10
public class ReadPropertyDemo {
    public static void main(String[] args) {
        Properties properties = new Properties();

        try {
            properties.load(new FileInputStream(
                    "com/technicalkeeda/demo/application.properties"));
            System.out.println("Domain :- " + properties.getProperty("domain"));
            System.out.println("Website Age :- "
                    + properties.getProperty("website_age"));
            System.out.println("Founder :- " + properties.getProperty("founder"));

            // Display all the values in the form of key value
            for (String key : properties.stringPropertyNames()) {
                String value = properties.getProperty(key);
                System.out.println("Key:- " + key + "Value:- " + value);
            }

        } catch (IOException e) {
            System.out.println("Exception Occurred" + e.getMessage());
        }

    }
}

2

Giả sử bạn sử dụng lớp Thuộc tính , thông qua phương thức tải của nó và tôi đoán bạn đang sử dụng ClassLoader getResourceAsStream để lấy luồng đầu vào.

Bạn đang chuyển tên như thế nào, có vẻ như nó phải ở dạng này: /com/al/common/email/templates/foo.properties


1

Tôi đã quản lý để giải quyết vấn đề này với cuộc gọi này

Properties props = PropertiesUtil.loadProperties("whatever.properties");

Ngoài ra, bạn phải đặt tệp tin anything.properties của mình vào / src / main / resources


9
Bạn đến PropertiesUtiltừ đâu?
Ben Watson

1

Không ai đề cập đến giải pháp tương tự nhưng thậm chí đơn giản hơn ở trên mà không cần phải xử lý gói của lớp. Giả sử myfile.properties nằm trong classpath.

        Properties properties = new Properties();
        InputStream in = ClassLoader.getSystemResourceAsStream("myfile.properties");
        properties.load(in);
        in.close();

Thưởng thức


-2

vui lòng sử dụng mã dưới đây:

    Thuộc tính p = new Properties (); Đường dẫn StringBuffer = new StringBuffer ( "com / al / common / email / templates /" ); 
    đường dẫn . append ( "foo.properties" ); InputStream fs = getClass (). getClassLoader () . getResourceAsStream ( đường dẫn . toString ());   
      
    
                                    

if(fs == null){ System.err.println("Unable to load the properties file"); } else{ try{ p.load(fs); } catch (IOException e) { e.printStackTrace(); } }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.