2008-12-02 42 views
98

Tôi cần đọc một tệp thuộc tính được chôn trong cấu trúc gói của mình trong com.al.common.email.templates.Tải tệp thuộc tính từ gói Java

Tôi đã thử mọi thứ và tôi không thể tìm ra.

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

Trả lời

217

Khi tải Properties từ một Class trong gói com.al.common.email.templates bạ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 học của bạn không có trong gói đó, bạn cần để thu được các InputStream hơi khác nhau:

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

đường dẫn tương đối (những người không có một lãnh đạo '/') 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 ở.

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.txt trên đường dẫn lớp.

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

+0

tôi đoán đoạn thứ hai là câu trả lời cho câu hỏi .. – Satya

+1

Góp ý: Thêm một lời giải thích khi sử dụng tương đối và khi nào sử dụng đường dẫn tuyệt đối (có và không có "/" ở bắt đầu). –

+0

Tôi đã cố gắng đưa ra một số lời giải thích. –

2

Giả sử bạn sử dụng lớp Properties, thông qua phương thức load và tôi đoán bạn đang sử dụng Trình nạp lớp getResourceAsStream để nhận luồng đầu vào.

How are you đi qua trong tên, có vẻ như nó phải ở trong hình thức này: /com/al/common/email/templates/foo.properties

42

Để thêm vào câu trả lời Joachim Sauer, nếu bạn đã bao giờ cần phải làm điều này trong một bối cảnh tĩnh, bạn có thể làm điều gì đó như như sau:

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

(xử lý ngoại lệ elided, như trước đây.)

+0

Đâ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. –

+0

@cobralibre cách đọc tệp thuộc tính nằm trong thư mục 'resources' trong dự án' maven' –

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

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

    } 
} 
13

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

Trường hợp 1: tải các thuộc tính tập tin sử dụng ClassLoader

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

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

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

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

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

Lưu ý:TestLoadProperties.javaTestLoadProperties.class là hai tệp khác nhau. Tệp cũ, .java, thường được tìm thấy trong thư mục src/ của dự án, trong khi tệp thứ hai, .class, thường được tìm thấy trong thư mục bin/ của nó.

-2

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

 
    Properties p = new Properties(); 
    StringBuffer path = new StringBuffer("com/al/common/email/templates/"); 
    path.append("foo.properties"); 
    InputStream fs = getClass().getClassLoader() 
            .getResourceAsStream(path.toString());

if(fs == null){ System.err.println("Unable to load the properties file"); } else{ try{ p.load(fs); } catch (IOException e) { e.printStackTrace(); } }
2

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

tắm, bạn cần phải đặt tập tin whatever.properties của bạn trong/src/main/nguồn

+4

Bạn lấy 'PropertiesUtil' ở đâu? –

0

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

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