<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无码专区亚洲精品| 99精品全国免费观看视频..| 扒开双腿猛进入爽爽免费视频 | 欧美最猛性xxxxx免费| 最新亚洲成av人免费看| 国产亚洲中文日本不卡二区 | 老司机午夜在线视频免费| 国产一区视频在线免费观看| 精品久久久久久亚洲综合网| 1000部国产成人免费视频| 亚洲国产片在线观看| 国产成人免费爽爽爽视频| 国产成人+综合亚洲+天堂| 亚洲一区日韩高清中文字幕亚洲| 亚洲夂夂婷婷色拍WW47| 亚洲大片免费观看| 亚洲精品国产字幕久久不卡| 99re免费在线视频| 亚洲中文字幕无码av| 亚洲Av无码乱码在线播放| 日韩精品在线免费观看| 色噜噜亚洲男人的天堂| 亚洲国产aⅴ综合网| 久久久久国产免费| 亚洲gv白嫩小受在线观看| 18禁成人网站免费观看| 亚洲av永久无码精品秋霞电影秋 | 亚洲中文字幕无码av永久| 亚洲中文字幕伊人久久无码| 中文字幕免费观看| 久久精品国产亚洲AV无码娇色 | 亚洲毛片免费视频| 偷自拍亚洲视频在线观看| 久久精品国产精品亚洲色婷婷| 亚洲精品自产拍在线观看| 中文字幕天天躁日日躁狠狠躁免费| 亚洲综合激情五月色一区|