2010-03-26 45 views
7

Hiii ... Tôi muốn lấy nội dung của tệp thuộc tính vào đối tượng lớp InputStream bằng cách sử dụng getSystemResourceAsStream(). Tôi đã xây dựng mã mẫu. Nó hoạt động tốt bằng cách sử dụng phương thức main(), nhưng khi tôi triển khai dự án và chạy trên máy chủ, đường dẫn tệp thuộc tính không thể thu được ... do đó đối tượng inputstream lưu trữ giá trị null.getSystemResourceAsStream() trả về null

Mẫu mã là ở đây ..

public class ReadPropertyFromFile { 

    public static Logger logger = Logger.getLogger(ReadPropertyFromFile.class); 

    public static String readProperty(String fileName, String propertyName) { 
     String value = null; 
     try { 
      //fileName = "api.properties"; 
      //propertyName = "api_loginid"; 

      System.out.println("11111111...In the read proprty file....."); 


      // ClassLoader loader = ClassLoader.getSystemClassLoader(); 

      InputStream inStream = ClassLoader.getSystemResourceAsStream(fileName); 

      System.out.println("In the read proprty file....."); 
      System.out.println("File Name :" + fileName); 
      System.out.println("instream = "+inStream); 

      Properties prop = new Properties(); 

      try { 
       prop.load(inStream); 
       value = prop.getProperty(propertyName); 
      } catch (Exception e) { 
       logger.warn("Error occured while reading property " + propertyName + " = ", e); 
       return null; 
      } 
     } catch (Exception e) { 
      System.out.println("Exception = " + e); 
     } 
     return value; 
    } 

    public static void main(String args[]) { 

     System.out.println("prop value = " + ReadPropertyFromFile.readProperty("api.properties", "api_loginid")); 
    } 
} 
+2

Tại sao sử dụng bộ nạp lớp hệ thống, thay vì sử dụng trình tải lớp thông thường? – skaffman

Trả lời

1

Hãy thử sử dụng getResourceAsStream() thay vì 'getSystemResourceAsStream()'.

6

SystemClassLoader tải tài nguyên từ java.class.path bản đồ phù hợp vào biến hệ thống CLASSPATH. Trong ứng dụng cục bộ của bạn, bạn có thể có tài nguyên mà bạn đang cố gắng tải cấu hình trong biến số java.class.path. Trong máy chủ, đó là một câu chuyện khác vì có lẽ máy chủ tải tài nguyên của bạn từ một trình nạp lớp khác.

Hãy thử sử dụng ClassLoader mà nạp lớp sử dụng đúng đường dẫn:

getClass().getResourceAsStream(fileName); 

article này cũng có thể có ích.

+0

getClass(). GetResourceAsStream ("input.properties"); đã làm cho tôi. tài nguyên nằm trên cùng một thư mục của lớp đang sử dụng nó –

15

tôi triển khai dự án và chạy trên máy chủ,

này nghe có vẻ giống như một JSP/Servlet webapplication. Trong trường hợp đó, bạn cần phải sử dụng ClassLoader mà là thu được như sau:

ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 

Cái này có quyền truy cập vào tất cả các đường dẫn classpath gắn liền với webapplication trong câu hỏi và bạn không nữa phụ thuộc vào cha mẹ mà classloader (một webapp có nhiều hơn một!) đã tải lớp của bạn.

Sau đó, trên trình nạp lớp này, bạn chỉ cần gọi getResourceAsStream() để nhận nguồn tài nguyên lớp học dưới dạng luồng, không phải là getSystemResourceAsStream() phụ thuộc vào cách khởi chạy ứng dụng web. Bạn không muốn phải phụ thuộc vào đó là tốt vì bạn không kiểm soát được nó ở lưu trữ bên ngoài:

InputStream input = classLoader.getResourceAsStream("filename.extension"); 

Đây là cuối cùng trở nên mạnh mẽ hơn cách tiếp cận getSystemResourceAsStream() ban đầu của bạn và Class#getResourceAsStream() theo đề nghị của người khác.