2012-06-28 50 views
15

Tôi có cấu trúc đường dẫn sau để lớp chính:Làm thế nào để đọc một tập tin thuộc tính trong java từ bên ngoài thư mục Class?

D:/java/myapp/src/manClass.java 

và tôi muốn đặt nộp các thuộc tính trong

D:/java/myapp/config.properties 

đó sẽ chứa một tên tập tin và một số cấu hình khác. Tôi sẽ đặt tên tập tin trong tập tin thuộc tính như thế này: file=file_to_read.txt

file_to_read.txt này sẽ được đặt tại D:/java/myapp/folder_of_file/

Các lớp học chính sẽ đọc tên tập tin từ tập tin thuộc tính đầu tiên và sau đó nhận được các nội dung hình thành các tập tin .

Tôi có thể làm điều này nếu cả hai config.propertiesfile_to_read.txt đều ở trong src/ với mainClass.java. Nhưng không thể thành công với cách tôi muốn làm.

Ai có thể giúp tôi với điều này? Tôi cần đề xuất của bạn về những gì tôi có thể làm nếu tôi muốn đặt thư mục myapp ở bất cứ nơi nào trong ổ đĩa của tôi với cùng cấu trúc bên trong trong đó tôi mô tả ở trên và chương trình sẽ thực hiện công việc một cách chính xác.

Tôi cũng cần đề xuất của bạn rằng nếu tôi muốn thực hiện công việc từ bình được tạo sau khi xây dựng dự án thì tôi có thể làm điều đó mà không có vấn đề gì không?

Tôi đã thử như sau chỉ để đọc tập tin thuộc tính:

 URL location = myClass.class.getProtectionDomain().getCodeSource().getLocation(); 

     String filePath = location.getPath().substring(1,location.getPath().length()); 

     InputStream in = myClass.class.getResourceAsStream(filePath + "config.properties"); 
     prop.load(in); 

     in.close(); 

     System.out.println(prop.getProperty("file")); 

Nhưng điều này mang lại phạm sai lầm khi cố gắng getProperty từ nộp các thuộc tính. Cảm ơn!

Trả lời

0

Bạn có thể thêm thư mục tệp cấu hình vào đường dẫn lớp thời gian chạy, sau đó bạn có thể truy cập nó bằng Class.getResourceAsStream().

28

Cách đọc tệp thuộc tính trong java từ bên ngoài thư mục Lớp?

Sử dụng FileInputStream với đường dẫn hệ thống tệp đĩa cố định.

InputStream input = new FileInputStream("D:/java/myapp/config.properties"); 

Tốt hơn nhiều là chỉ cần di chuyển nó đến một trong những con đường hiện có thuộc phạm vi classpath thay vào đó, hoặc để thêm đường dẫn gốc của nó D:/java/myapp/ vào classpath. Sau đó, bạn có thể lấy nó như sau:

InputStream input = getClass().getResourceAsStream("/config.properties"); 

hoặc

InputStream input = Thread.currentThread().getContextClassLoader().getResourceAsStream("config.properties"); 
+1

Có, sử dụng giải pháp đầu tiên của BalusC. – Klinetel

+0

Cảm ơn, nó đã làm việc cho tôi. Nhưng, tôi cần phải thêm một bình luận. Nếu bạn thêm thư mục vào classpath, thì bạn không cần phải chỉ định thư mục khi nhận tài nguyên dưới dạng stream, điều đó có nghĩa là bạn chỉ cần gọi getResourceAsStream ("/ config.properties") ngay cả khi tệp đó nằm trong thư mục có tên tài nguyên –

+1

@ Jesus: Có, nó có ý định sử dụng nội dung của thư mục giống như tất cả các thư mục khác đã có trong classpath (mặc định). – BalusC

6

Cảm ơn tất cả mọi người cho ý kiến ​​của bạn. Tôi đã thực hiện công việc theo cách này:

 Properties prop = new Properties(); 
     String dir = System.getProperty("user.dir"); 
     InputStream in = new FileInputStream(dir + "/myapp/config.properties"); 
     prop.load(in); 
     in.close(); 
     String filePath = dir + "/myapp/folder_of_file/" + prop.getProperty("file"); /*file contains the file name to read*/ 
+1

Đây không phải là thực sự di động, hoặc bạn nên tài liệu này rất rõ ràng trong hướng dẫn cài đặt ứng dụng của bạn. Chỉ cần đặt trong classpath hoặc thêm đường dẫn của nó để classpath là dễ dàng hơn nhiều. – BalusC

+0

@BalusC, nếu tôi muốn chỉnh sửa tệp thuộc tính trong thời gian chạy thì sao? – gdrt

0

Bạn cần xác định đường dẫn tuyệt đối nhưng không nên mã hóa nó vì điều đó sẽ làm cho việc chuyển đổi giữa môi trường phát triển và sản xuất trở nên khó khăn hơn.

Bạn có thể lấy đường dẫn cơ sở của tệp từ thuộc tính Hệ thống mà bạn có thể truy cập bằng System.getProperty ("basePath") trong mã của bạn và cần được thêm vào tên tệp của bạn để tạo đường dẫn tuyệt đối .

Trong khi chạy ứng dụng của bạn, bạn có thể chỉ định đường dẫn ở dòng lệnh java như sau:

java -DbasePath="https://stackoverflow.com/a/b/c" ... 

... nghĩa các đối số dòng lệnh Java của bạn để chạy chương trình của bạn.

2
Properties property=new Properties(); 
property.load(new FileInputStream("C:/java/myapp/config.properties")); 
Các vấn đề liên quan