2013-08-05 27 views
14

Tôi đang cố tải tệp thuộc tính. Dưới đây là cấu trúc của tôigetResourceAsStream() trả về giá trị rỗng. Tệp thuộc tính không tải

Directory Structure

Bây giờ tôi đang cố gắng để tải test.properties tập tin. Nhưng tôi đang nhận được null. Dưới đây làm thế nào tôi đang làm

public class Test { 

    String workingDir = System.getProperty("user.dir"); 
    System.out.println("Current working directory : " + workingDir); 

    File temp = new File(workingDir + "\\" + "test.properties"); 
    String absolutePath = temp.getAbsolutePath(); 
    System.out.println("File path : " + absolutePath); 

    Properties properties = null; 

    try { 
     properties = new Properties(); 
     InputStream resourceAsStream = Test.class.getClassLoader().getResourceAsStream(absolutePath); 
     if (resourceAsStream != null) { 
      properties.load(resourceAsStream); 
     } 


    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    System.exit(0); 

} //end of class Test 

Chương trình này in

Current working directory : D:\Personal Work\eclipse 32 Bit\workspace\Spring Integration\LS360BatchImportIntegration 
File path : D:\Personal Work\eclipse 32 Bit\workspace\Spring Integration\LS360BatchImportIntegration\test.properties 

Nhưng nó không phải đang tải tập tin thuộc tính từ con đường này. Mặc dù nó có mặt ở đó. Tại sao tôi nhận được null?

Cảm ơn

Sửa --- ----------------------------

String workingDir = System.getProperty("user.dir"); 
System.out.println("Current working directory : " + workingDir); 

File temp = new File(workingDir, "test.properties"); 

String absolutePath = temp.getAbsolutePath(); 
System.out.println("File path : " + absolutePath); 

try { 
    properties = new Properties(); 
    InputStream resourceAsStream = new FileInputStream(temp); 
    if (resourceAsStream != null) { 
     properties.load(resourceAsStream); 
    } 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

System.exit(0); 

Current working directory : D:\Personal Work\eclipse 32 Bit\workspace\Spring Integration\LS360BatchImportIntegration 
File path : D:\Personal Work\eclipse 32 Bit\workspace\Spring Integration\LS360BatchImportIntegration\test.properties 
java.io.FileNotFoundException: D:\Personal Work\eclipse 32 Bit\workspace\Spring Integration\LS360BatchImportIntegration\test.properties (The system cannot find the file specified) 
at java.io.FileInputStream.open(Native Method) 
at java.io.FileInputStream.<init>(Unknown Source) 
at com.softech.ls360.integration.BatchImport.main(BatchImport.java:57) 

Trả lời

22

Oh oh ... Có một số vấn đề ở đây:

1) Trong đoạn mã được cung cấp đầu tiên của bạn, bạn đang sử dụng một ClassLoader cho tải một tập tin tài nguyên. Đây thực sự là một quyết định tốt. Nhưng phương thức getResourceAsStream cần một tên "tương đối đường dẫn lớp". Bạn đang cung cấp một đường dẫn tuyệt đối.

2) Đoạn mã thứ hai (sau khi chỉnh sửa) của bạn không thể tìm thấy tệp "D: ... \ LS360BatchImportIntegration \ test.properties". Theo ảnh chụp màn hình của bạn, tệp phải là "D: ... \ LS360AutomatedRegulatorsReportingService \ test.properties". Đây là một thư mục khác.

Tôi lo ngại, rằng các mô tả của bạn không được cập nhật với các phát hiện trên máy của bạn.

Nhưng chúng ta hãy chỉ di chuyển đến một giải pháp hợp lý:

1) Trong dự án Eclipse của bạn (ảnh chụp màn hình cho chúng ta biết, rằng bạn đang sử dụng Eclipse), tạo ra một thư mục mới có tên là "tài nguyên" ở độ sâu tương tự như của bạn "src" thư mục. Sao chép - hoặc di chuyển tốt hơn - tệp thuộc tính vào đó.

2) Thư mục mới này phải được đưa vào "đường dẫn xây dựng".Nhấp chuột phải vào thư mục trong khung nhìn Package Explorer hoặc Project Explorer, chọn "Build Path", sau đó "Use as Source Folder". Ghi chú: Đường dẫn xây dựng này sẽ là đường dẫn lớp cho dự án, khi bạn chạy nó.

3) Vì thư mục tài nguyên hiện là một phần của đường dẫn lớp và chứa tệp thuộc tính của bạn, bạn chỉ cần tải nó với getResourceAsStream("test.properties").

EDIT

Tôi chỉ thấy, bạn cũng sử dụng Maven (tệp pom.xml). Trong Maven, thư mục tài nguyên như vậy tồn tại theo mặc định và là một phần của đường dẫn xây dựng. Đó là "src/main/resources". Nếu vậy, chỉ cần sử dụng này.

+0

Có, tôi thấy rằng tôi sao chép tệp 'test.proeprties' ở sai vị trí. Bây giờ nó đang tải từ dòng sau khi đặt nó vào đúng chỗ :). Có tôi đang sử dụng maven. Bạn có nghĩa là di chuyển tập tin thuộc tính vào thư mục 'src/main/resources'. Và thêm thư mục 'src/main/resources' vào đường dẫn lớp bằng cách nhấp chuột phải như bạn đã nói (điểm 2)? – Basit

+0

Tôi nghĩ 'src/main/resources' đã có trên đường dẫn lớp trong maven ..? – Basit

+0

@Basit: Chính xác. "src/main/resources" là thư mục mặc định Maven cho các tài nguyên như vậy. Nếu bạn sử dụng Maven để đóng gói ứng dụng của bạn, nó sẽ được xem xét tự động (và trở thành một phần của JAR của bạn). Nếu bạn chạy dự án trong Eclipse, plugin M2E sẽ xử lý điều đó. – Seelenvirtuose

0

bạn đang đi qua một đường dẫn tập tin để getResourceAsStream(String name), nhưng name đây là một đường dẫn lớp, không phải là một đường dẫn tập tin ...

bạn có thể chắc chắn rằng các tập tin là trên classpath của bạn, hoặc sử dụng một FileInputStream để thay thế.

8

Bạn đang sử dụng trình nạp lớp (đọc trong đường dẫn lớp) trong khi bạn đang sử dụng đường dẫn tuyệt đối.

Đơn giản chỉ cần thử:

InputStream resourceAsStream = new FileInputStream(temp); 

Như một mặt lưu ý, hãy thử instanciating tập tin của bạn thực hiện:

File temp = new File(workingDir, "test.properties"); 

để sử dụng đường dẫn spearator hệ thống phụ thuộc vào.

+1

tôi nhận được ngoại lệ. Không tìm thấy ngoại lệ tệp tại sao? Ở đây tôi đã sử dụng 'InputStream resourceAsStream = new FileInputStream (temp);'. Tệp thuộc tính có mặt ở đó. Bạn có thể thấy nó trong đầu ra ...? – Basit

+0

Kiểm tra chỉnh sửa của tôi, vui lòng .. – Basit

+0

Thực ra, '' workingDir'' của bạn không phải là thuộc tính chứa thuộc tính! Các thuộc tính của bạn nằm trong '' LS360AutomatedRegulatorsReportingService'' trong khi mã trả về '' LS360BatchImportIntegration'' –

5

Vui lòng đặt tệp thuộc tính của bạn vào thư mục/src/main/resources và tải từ ClassLoader. Nó sẽ được sửa chữa.

như

/src/main/resources/test.properties 



Properties properties = null; 

try { 
    properties = new Properties(); 
    InputStream resourceAsStream = Test.class.getClassLoader().getResourceAsStream("test.properties"); 
    if (resourceAsStream != null) { 
     properties.load(resourceAsStream); 
    } 


} catch (IOException e) { 
    e.printStackTrace(); 
} 
+0

ok, sau khi đưa vào thư mục tài nguyên, sau đó chỉ cần sử dụng 'InputStream resourceAsStream = \t BatchImport.class.getResourceAsStream (" test.properties ");'. Là nó ? – Basit

+0

Có, tệp tìm kiếm ClassLoader Becasue trong đường dẫn lớp –

0

Tôi đã có một vấn đề tương tự với một tập tin không được tìm thấy bởi getResourceAsStream(). Tệp nằm trong thư mục tài nguyên (src/main/resources) và vẫn không tìm thấy.

Sự cố đã được giải quyết khi tôi đi vào nhật thực Package Explorer và "làm mới" thư mục tài nguyên. Nó nằm trong thư mục, nhưng Eclipse không thấy nó cho đến khi thư mục được làm mới (nhấn chuột phải vào thư mục và chọn Refresh).

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