2012-04-19 51 views
7

Tôi đang sử dụng java.util.prefs.Preferences cho các tùy chọn ứng dụng. Và tôi cần có khả năng chỉnh sửa các tùy chọn đó theo cách thủ công. Có thể lưu nó vào tệp thay vì Windows Registry không? Hoặc tôi nên sử dụng một cơ chế khác thay vì java.util.prefs.Preferences?cách lưu trữ java.util.prefs.Preferences trong tệp?

+0

[java.util.Properties] (http://download.oracle.com/javase/tutorial/essential/environment/properties.html) có thể? Nó ít mịn hơn so với sở thích mặc dù. – BalusC

+0

Tôi đoán bạn chưa sử dụng [Javadoc] (http://docs.oracle.com/javase/1.4.2/docs/api/java/util/prefs/Preferences.html). Làm điều đó và xem bạn có còn gì để hỏi không. –

+2

@MarkoTopolnik bạn có nghĩa là "Dữ liệu này được lưu trữ liên tục trong cửa hàng sao lưu phụ thuộc vào triển khai.Triển khai điển hình bao gồm các tệp phẳng, sổ đăng ký dành riêng cho hệ điều hành, máy chủ thư mục và cơ sở dữ liệu SQL. ** Người dùng của lớp này không cần phải quan tâm đến chi tiết của cửa hàng sao lưu. ** "??? – denys

Trả lời

6

Nếu bạn muốn tiếp tục sử dụng API Preferences, nhưng viết thư cho một tập tin, bạn sẽ cần một mới PreferencesFactory, như chi tiết trong this SO post.

0

Nó được giải thích trong bài khác, here

Properties prop = new Properties(); 
InputStream in = getClass().getResourceAsStream("foo.properties"); 
prop.load(in); 
in.close() 
+0

xin lỗi - Không giống nhau [so sánh API tùy chọn với các cơ chế khác] (http://docs.oracle.com/javase/1.5.0/docs/guide/preferences/index.html#prefs-other). Trong các cửa sổ ở đó là hai nơi mà các sở thích có thể được đặt .. Registry hoặc% APPDATA% Fe trong QSettings (Qt Framework) Tôi có thể lựa chọn giữa 2 tùy chọn này ... – denys

+2

Xin lỗi, tôi đã hiểu lầm.Điều gì về điều đó? Tôi không thể kiểm tra nhưng có vẻ như wh bạn đang tìm kiếm. http://www.davidc.net/programming/java/java-preferences-using-file-backing-store –

+0

Tốt hơn nhiều. Cảm ơn bạn, @MEK. – denys

5

Bạn sẽ muốn sử dụng hai phương pháp sau đây:

Preferences.exportSubtree(OutputStream os) 

Preferences.importPreferences(InputStream is) 
0

Tôi nghĩ rằng bạn có thể sử dụng các file tài sản thay thế. Chúng được lưu trữ trong hệ thống tập tin. Bạn có thể xác định đường dẫn bạn muốn. Và bạn có thể chỉnh sửa nó bằng tay. Xem this question để biết thêm chi tiết.

2

Mã này sẽ giúp bạn [http://java.sun.com/developer/technicalArticles/releases/preferences/]:

public class PrefSave { 

private static final String PACKAGE = "/pl/test"; 

public static void main(String[] args) { 
    doThings(Preferences.systemRoot().node(PACKAGE)); 
    doThings(Preferences.userRoot().node(PACKAGE)); 
} 

public static void doThings(Preferences prefs) { 
    prefs.putBoolean("Key0", false); 
    prefs.put("Key1", "Value1"); 
    prefs.putInt("Key2", 2); 

    Preferences grandparentPrefs = prefs.parent().parent(); 
    grandparentPrefs.putDouble("ParentKey0", Math.E); 
    grandparentPrefs.putFloat("ParentKey1", (float) Math.PI); 
    grandparentPrefs.putLong("ParentKey2", Long.MAX_VALUE); 

    String fileNamePrefix = "System"; 
    if (prefs.isUserNode()) { 
     fileNamePrefix = "User"; 
    } 
    try { 
     OutputStream osTree = new BufferedOutputStream(
       new FileOutputStream(fileNamePrefix + "Tree.xml")); 
     grandparentPrefs.exportSubtree(osTree); 
     osTree.close(); 

     OutputStream osNode = new BufferedOutputStream(
       new FileOutputStream(fileNamePrefix + "Node.xml")); 
     grandparentPrefs.exportNode(osNode); 
     osNode.close(); 
    } catch (IOException ioEx) { 
     // ignore 
    } catch (BackingStoreException bsEx) { 
     // ignore too 
    } 
} 
0

Một khi trở lại tôi đã phải đưa ra một thực hiện các Lớp tùy chọn sẽ đọc cài đặt từ nhưng không ghi vào sổ đăng ký. Tôi bắt nguồn một lớp ReadOnlyPreferences từ AbstractPreferences để thực hiện điều này. Sau đó, tôi cần chính xác chức năng tương tự này mà bạn yêu cầu để đi đến/từ các tập tin. Tôi vừa mở rộng lớp ReadOnlyPreferences của mình để ghi đè lên sync() và flush() để giữ cho tệp được đồng bộ. Phần thú vị về điều này nó sẽ sử dụng cùng một logic chính xác để áp dụng mặc định cho các giá trị giống như việc sử dụng thông thường của các prefs vì không có gì thực sự tồn tại trong sổ đăng ký để đọc. Tôi giữ các tập tin trong đồng bộ bằng cách sử dụng exportSubtree() và importPreferences() từ lớp cơ sở để làm tất cả các nâng nặng cho tôi.

Tôi rất tiếc tôi không thể đăng mã vì tôi không sở hữu mã nhưng tôi đã sử dụng công cụ ưu tiên được mã hóa mà bạn có thể tìm thấy tại liên kết sau làm điểm bắt đầu. Đó là những gì tôi đã làm và nó đã cho tôi khoảng một giờ để chưng cất nó xuống chỉ là những gì tôi cần mà chủ yếu là ném mã đi đó là dễ dàng hơn nhiều so với viết mã! Nó cũng được xuất bản trong Dr Dobbs tại liên kết sau nếu bạn không muốn bấm vào cái đầu tiên. Tôi chưa bao giờ thấy một nơi dễ dàng trên bài viết dobbs để tải xuống toàn bộ nguồn. Bất kể, bài viết là tốt nhất tôi đã nhìn thấy để mở rộng các công cụ ưu đãi.

http://www.panix.com/~mito/articles/#ep

http://www.drdobbs.com/security/encrypted-preferences-in-java/184416587?pgno=4

-1

Thử lớp sau đó cho phép bạn sử dụng một số đơn giản put()get() chức năng sử dụng một configuration.xml tệp cục bộ.

import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.util.InvalidPropertiesFormatException; 
import java.util.Properties; 

public class SimpleProperties 
{ 
    private String propertiesFilePath; 
    private Properties properties; 

    public SimpleProperties() throws InvalidPropertiesFormatException, IOException 
    { 
     propertiesFilePath = "configuration.xml"; 
     properties = new Properties(); 

     try 
     { 
      properties.loadFromXML(new FileInputStream(propertiesFilePath)); 
     } catch (InvalidPropertiesFormatException e) 
     { 

     } 
    } 

    public void put(String key, String value) throws FileNotFoundException, IOException 
    { 
     properties.setProperty(key, value); 

     store(); 
    } 

    public String get(String key) 
    { 
     return properties.getProperty(key); 
    } 

    private void store() throws FileNotFoundException, IOException 
    { 
     String commentText = "Program parameters"; 

     properties.storeToXML(new FileOutputStream(propertiesFilePath), commentText); 
    } 
} 
Các vấn đề liên quan