<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-86  評論-33  文章-0  trackbacks-0

    JAVA訪問注冊表

    --------------------------------------------------------------------------------
      (轉載: fengmin  2005-12-13 10:06:00 )

    JDK1.4下實現訪問WIN32注冊表 
    (通過  JSR  10)為  Java  1.4  增加的  java.util.prefs  包,通過提供對特定于實現的注冊表(例如,Windows  平臺上的  Windows  注冊表)的訪問能力,使您能夠操作用戶首選項數據和配置數據。 
    您是不是曾經需要保存程序的配置數據但卻不知應將數據存儲在哪里?  雖然您可以使用屬性文件或資源束獲取這些信息,但  Java  平臺從未指定過用于存儲這些文件的標準位置。JSR  10  出現后一切都變了,它為  Java  1.4  API  提供增加的  java.util.prefs  包。存儲機制是特定于實現的細節,但程序員不必知道,也不必操心。對于  Windows  平臺,它的位置是在“Windows  注冊表”。  您雖然不能夠對注冊表自由控制,但您的確可以通過一個公共根節點訪問所有的應用程序。 
     
    開始 
    命名很恰當的  Preferences  類提供操作首選項的基本框架。這個類提供了一系列靜態和抽象方法來操作兩套首選項(其中一套是用戶首選項,另一套是系統首選項)中的其中一套。  使用靜態方法,您會得到一個特定于平臺的實現,就象  WindowsPreferences  類;  然后您可以使用由這個特定于平臺的實現實現的抽象方法來做這項工作。 
     
    用包將程序的首選項分組是個好習慣,可以避免與其它應用程序的命名沖突。  當您查找  Preferences  對象時,只需傳遞包的名稱。在使用非靜態方法時,  您可以傳遞對自身的引用(this),程序將為您確定查找的是哪個包,如清單  1  所示。 
     
    清單  1.  從非靜態方法獲取  Preferences  對象   

    Preferences  userPrefs  =  Preferences.userNodeForPackage(this);  
    Preferences  sysPrefs  
    =  Preferences.systemNodeForPackage(this);  

    但是,如果您使用的是靜態方法,您就必須得到根節點并自己提供包,如清單  2  所示。 
     
    清單  2.  從靜態方法獲取  Preferences  對象   

    Preferences  userPrefs  =  Preferences.userRoot().node("/net/zukowski/ibm");  
    Preferences  sysPrefs  
    =  Preferences.systemRoot().node("/net/zukowski/ibm");  

    有了進行操作的節點后,您就可以輕松地設置、獲取、除去和轉儲設置選項。只要把  Preferences  對象當作一個大的鍵  —  值散列表(這個表把樹形結構中的鍵組織起來)。可它不是“集合框架”(  Collections  Framework)的部件,(關于“集合框架”的更多信息,請參閱參考資料)。 
     
    寫數據 
    我們將從討論如何存儲首選項開始。Preferences  類提供一系列  put()  方法,如下所示,用于存儲值。除支持基本的字符串之外,您還可以存儲布爾值、雙精度數、浮點數、整型數、長整型數和字節數組(考慮序列化)。助手方法采用適當的數據類型并執行必要的轉換以便將數據存儲為字符串。  

    put(String  key,  String  value)    
    putBoolean(String  key,  
    boolean  value)    
    putByteArray(String  key,  
    byte  value[])    
    putDouble(String  key,  
    double  value)    
    putFloat(String  key,  
    float  value)    
    putInt(String  key,  
    int  value)    
    putLong(String  key,  
    long  value)  

    所有的  put()  方法都返回一個  void。如果存儲機制不可用,將拋出一個BackingStoreException。 
     
    注意:一個特定首選項的鍵長度被限制為  Preferences.MAX_KEY_LENGTH(80)個字符,而它的值被限制為  Preferences.MAX_VALUE_LENGTH(8192)個字符。 
     
    讀數據 
    可通過下面所示的一系列  get()  方法獲取特定的首選項。與寫數據相似,每種受支持的數據類型,都有自己的與眾不同的方法。但與獲取數據時不同的是,在備用存儲不可用,或有些東西尚未保存時您必須提供缺省值。這要求您確保自己的程序至少要有合理的缺省設置選項。  

    get(String  key,  String  default)    
    getBoolean(String  key,  
    boolean  default)    
    getByteArray(String  key,  
    byte  default[])    
    getDouble(String  key,  
    double  default)    
    getFloat(String  key,  
    float  default)    
    getInt(String  key,  
    int  default)    
    getLong(String  key,  
    long  default)  

    如果您對首選項名稱不確定,您可以用  keys()  方法查找一列與節點相關聯的鍵。這個方法返回節點的  String[]。  除獲取和存儲個別首選項以及獲取一列關鍵字之外,您還可以用  clear()、remove()  和  removeNode()  除去節點和值。 
     
    轉儲數據 
    如果您想在系統提供的備用存儲器之外保存和恢復首選項,您可以在  XML  格式的文檔中執行這些操作。您可以用  exportNode()  導出一個節點或用  exportSubtree()  導出整個子樹。信息以  UTF-8  格式存儲。然后,當您想恢復信息時,可使用  importPreferences()  方法。 
     
    偵聽 
    “好奇心會害死一只貓”,但如果您對弄清除首選項何時改變很感興趣,您可以注冊一個  NodeChangeListener  或  PreferenceChangeListener,而不考慮隨之而來的后果。NodeChangeListener  負責通知您節點被添加和除去的時間,  而  PreferenceChangeListener  告訴您值的變化。這些都緊跟著基本  JavaBeans  組件事件用  add/removeNodeChangeListener(NodeChangeListener)  和  add/removePreferenceChangeListener()  方法處理結構之后發生。基本上,您先實現偵聽器,然后注冊偵聽器,這樣您會發現將來的變化。 
     
    完整的示例 
    真的就這些。清單  3  為您提供了一個完整的示例來試驗新功能(也可從參考資料下載)。程序運行后會自己清除,所以如果您想在注冊表中找到值,請注釋掉程序尾部的清除代碼。 
     
    清單  3.  完整的示例   

     1 package  net.zukowski.ibm;  
     2  
     3 import  java.io.*;  
     4 import  java.util.prefs.*;  
     5  
     6 public  class  Prefs  {  
     7    public  static  void  main(String  args[])  {  
     8        String  denominations[]  =    
     9            {"One",  "Two",  "Five",  "Ten",  "Twenty"};  
    10        String  pictures[]  =    
    11            {"Washington",  "Jefferson",  "Lincoln",  "Hamilton",  "Jackson"};  
    12  
    13        NodeChangeListener  nodeChangeListener  =    
    14            new  NodeChangeListener()  {  
    15                public  void  childAdded(NodeChangeEvent  event)  {  
    16                    Preferences  parent  =  event.getParent();  
    17                    Preferences  child    =  event.getChild();  
    18                    System.out.println(parent.name()  +  "  has  a  new  child  "  +  
    19                        child.name());  
    20                }  
    21                public  void  childRemoved(NodeChangeEvent  event)  {  
    22                    Preferences  parent  =  event.getParent();  
    23                    Preferences  child    =  event.getChild();  
    24                    System.out.println(parent.name()  +  "  lost  a  child  "  +  
    25                        child.name());  
    26                }  
    27            };  
    28  
    29        PreferenceChangeListener  preferenceChangeListener  =    
    30            new  PreferenceChangeListener()  {  
    31                public  void  preferenceChange(PreferenceChangeEvent  event)  {  
    32                    String  key  =  event.getKey();  
    33                    String  value  =  event.getNewValue();  
    34                    Preferences  node  =  event.getNode();  
    35                    System.out.println(node.name()  +  "  now  has  a  value  of  "  +    
    36                        value  +  "  for  "  +  key);  
    37                }  
    38            };  
    39  
    40        //  Look  up  user  root  
    41        Preferences  prefs  =    
    42            Preferences.userRoot().node("/net/zukowski/ibm");  
    43  
    44        //  Add  listeners  
    45        prefs.addNodeChangeListener(nodeChangeListener);  
    46        prefs.addPreferenceChangeListener(preferenceChangeListener);  
    47  
    48        //  Save  a  bunch  of  key-value  pairs  
    49        for  (int  i=0,  n=denominations.length;  i  <  n;  i++)  {  
    50            prefs.put(denominations[i],  pictures[i]);  
    51        }  
    52  
    53        //  Display  all  the  entries  
    54        try  {  
    55            String  keys[]  =  prefs.keys();  
    56            for  (int  i=0,  n=keys.length;  i  <  n;  i++)  {  
    57                System.out.println(keys[i]  +  ":  "  +  prefs.get(keys[i],  "Unknown"));  
    58            }  
    59        }  catch  (BackingStoreException  e)  {  
    60            System.err.println("Unable  to  read  backing  store:  "  +  e);  
    61        }  
    62  
    63        //  Create  child  
    64        Preferences  child  =  Preferences.userRoot().node("/net/zukowski/ibm/foo");  
    65  
    66        //  Save  to  XML  file  
    67        try  {  
    68            FileOutputStream  fos  =  new  FileOutputStream("prefs.out");  
    69            prefs.exportNode(fos);  
    70        }  catch  (Exception  e)  {  
    71            System.err.println("Unable  to  export  nodes:  "  +  e);  
    72        }  
    73  
    74        //  Clean  up  
    75        try  {  
    76            prefs.removeNode();  
    77        }  catch  (BackingStoreException  e)  {  
    78            System.err.println("Unable  to  access  backing  store:  "  +  e);  
    79        }  
    80  
    81    }  
    82 
    83 
    posted on 2006-02-06 09:14 Derek.Guo 閱讀(673) 評論(0)  編輯  收藏 所屬分類: Java
    MSN:envoydada@hotmail.com QQ:34935442
    主站蜘蛛池模板: 久久精品国产亚洲AV大全| 亚洲综合国产一区二区三区| 亚洲免费在线播放| 免费毛片a线观看| 亚洲女久久久噜噜噜熟女| j8又粗又长又硬又爽免费视频 | 亚洲五月综合缴情在线观看| 一级毛片a免费播放王色| 亚洲午夜无码AV毛片久久| jizz在线免费观看| 亚洲AV永久无码区成人网站| 秋霞人成在线观看免费视频| 久久久久久久国产免费看| 亚洲日韩在线第一页| 成人毛片100免费观看| 国产AV无码专区亚洲Av| 久热免费在线视频| 亚洲一区免费在线观看| 午夜免费福利在线观看| 国产一区二区三区亚洲综合| 久久久久无码专区亚洲av| 久草福利资源网站免费| 亚洲国产成人久久| 国产成人免费a在线视频色戒| 黄网站色视频免费看无下截 | 狠狠亚洲婷婷综合色香五月排名| 国产免费福利体检区久久| 亚洲图片一区二区| 成全视频免费高清| 九九免费精品视频在这里| 午夜亚洲www湿好大| 天天干在线免费视频| 久久久久久av无码免费看大片| 午夜亚洲国产理论秋霞| 妞干网免费视频观看| 男女拍拍拍免费视频网站| 亚洲国产精品美女| 亚洲日本一区二区三区在线不卡| 久久伊人免费视频| 亚洲国产精华液2020| 亚洲AV无码久久精品狠狠爱浪潮|