2011-07-14 41 views
6

Tôi có tệp thuộc tính bên trong gói mặc định và lớp mà tôi đang sử dụng tệp thuộc tính cũng nằm trong cùng gói mặc định. Nếu tôi chỉ sử dụng tên tập tin mà không có bất kỳ đường dẫn nào tôi nhận được lỗi. Rõ ràng đó là không chính xác như tôi nên cung cấp cho một số loại đường dẫn để đề cập đến tập tin tat. Tôi sẽ xây dựng các ứng dụng làm cho nó như là một tập tin jar vì vậy làm thế nào tôi nên cung cấp cho các đường dẫn như các tập tin thuộc tính nên đi bên trong tập tin jar. Tôi đang sử dụng Netbeans IDE.Đường dẫn tệp thuộc tính trong java

EDIT

Properties pro = new Properties(); 

    try {    
     pro.load(new FileInputStream("pos_config.properties")); 
     pro.setProperty("pos_id", "2"); 
     pro.setProperty("shop_type", "2"); 
     pro.store(new FileOutputStream("pos_config.properties"), null); 
     String pos_id = pro.getProperty("pos_id"); 
     if(pos_id.equals("")){ 
      pos_id="0" ; 
     } 
     global_variables.station_id = Integer.parseInt(pos_id); 
     String shop_type = pro.getProperty("shop_type"); 
     if(shop_type.equals("")){ 
      shop_type="0" ; 
     } 
     global_variables.shop_type = Integer.parseInt(shop_type); 
    } catch (IOException ex) { 
     Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); 
    } 
+0

Vui lòng đăng mã mà bạn đang sử dụng để truy cập tệp thuộc tính. – mre

+0

@ little bunny foo foo: Kiểm tra chỉnh sửa của tôi .. – Deepak

+0

Tôi không sử dụng netbeans nhưng nếu bạn nhấp chuột phải vào tệp trong netbeans, bạn không có gì giống như 'đường dẫn xây dựng> bao gồm ' – talnicolas

Trả lời

9

Sử dụng getClass().getResourceAsStream("foo.properties")

Nhưng lưu ý rằng việc sử dụng gói mặc định không được khuyến khích (ở trên sẽ làm việc với bất kỳ gói).

Mã của bạn không hoạt động vì FileInputStream(..) sử dụng các đường dẫn có liên quan đến thư mục người dùng hiện tại (xem tài liệu java.io.File). Vì vậy, nó sẽ tìm kiếm foo.properties trong /home/usr/ hoặc c:\documents and settings\usr. Vì tệp .properties của bạn nằm trên đường dẫn lớp, bạn có thể đọc tệp như vậy - hãy sử dụng phương thức Class.getResourceAsStream(..).

4

Bạn đang cố gắng lấy tệp thuộc tính từ thư mục làm việc hiện tại hoặc bạn đang cố gắng lấy nó làm tài nguyên? Có vẻ như bạn nên sử dụng.

InputStream is = getClass().getResourceAsStream(filename); 
properties.load(is); 

để tải một tập tin từ thư mục hiện hành

properties.load(new FileInputStream(filename)); 

Tôi đoán là những gì bạn thực sự muốn là này.

try {    
    Properties pro = new Properties(); 
    pro.load(new FileInputStream("pos_config.properties")); 
    String pos_id = pro.getProperty("pos_id"); 
    try { 
     global_variables.station_id = Integer.parseInt(pos_id); 
    } catch(Exception e) { 
     global_variables.station_id = 0; 
    } 
    String shop_type = pro.getProperty("shop_type"); 
    try { 
     global_variables.shop_type = Integer.parseInt(shop_type); 
    } catch(Exception e) { 
     global_variables.shop_type = 0; 
    } 
} catch (IOException ex) { 
    Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); 
} 
+0

vâng tôi đang cố gắng lấy nó từ thư mục hiện tại. và tôi đang nhận được trong công cộng tĩnh void chính() vì vậy làm thế nào tôi có thể sử dụng phương pháp này không tĩnh trong bối cảnh tĩnh? – Deepak

+0

Khi bạn sử dụng tham chiếu 'thuộc tính', bạn có thể sử dụng các phương thức không tĩnh của Thuộc tính –

+0

getResourceAsInputStream() -> getResourceAsStream() –

3

Tôi vẫn khuyên bạn nên đặt tất cả các tệp thuộc tính vào thư mục tài nguyên.

Trong Eclipse, bạn có thể tạo một thư mục nguồn với:

Kích chuột phải -> mới -> Nguồn Thư mục

Tôi đặt cược có cái gì đó tương tự trong Netbeans. Đặt tất cả các tập tin tài sản của bạn trong đó. Sau đó bạn có thể truy cập chúng với đoạn mã sau:

AnyClass.class.getResource("/image.png") 

Vì vậy, đối với vấn đề cụ thể của bạn, bạn sẽ truy cập vào nó như thế:

pro.load(new FileInputStream(YourClass.class.getResource("/pos_config.properties"))); 
6

Như những người khác đã chỉ ra, bạn nên tải nó từ classpath thay vì như một tập tin nếu bạn muốn để có thể tải nó từ một cái lọ. Bạn muốn phương thức Class.getResourceAsStream() hoặc phương pháp ClassLoader.getResourceAsStream(). Tuy nhiên, việc sử dụng getClass().getResourceAsStream("pos_config.properties") rất nguy hiểm vì bạn đang sử dụng đường dẫn được giải quyết tương đối so với lớp đã cho và lớp con có thể thay đổi vị trí mà nó đã được giải quyết.Vì vậy, nó là an toàn nhất để đặt tên cho một đường dẫn tuyệt đối trong jar:

getClass().getResourceAsStream("/pos_config.properties") 

hoặc thậm chí tốt hơn, sử dụng một lớp đen thay vì getClass():

Foo.class.getResourceAsStream("pos_config.properties") 
0

này sẽ không biên dịch:

pro.load(new FileInputStream(YourClass.class.getResource("/pos_config.properties"))); 

sử dụng đúng cách:

pro.load(YourClass.class.getResourceAsStream("/pos_config.properties"))); 
2

Trong phương pháp tĩnh, tôi sử dụng

ClassLoader.getSystemResourceAsStream ("name.properties");

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