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

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

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

    隨筆-86  評(píng)論-33  文章-0  trackbacks-0

    JAVA訪問注冊(cè)表

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

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

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

    但是,如果您使用的是靜態(tài)方法,您就必須得到根節(jié)點(diǎn)并自己提供包,如清單  2  所示。 
     
    清單  2.  從靜態(tài)方法獲取  Preferences  對(duì)象   

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

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

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

    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)  

    如果您對(duì)首選項(xiàng)名稱不確定,您可以用  keys()  方法查找一列與節(jié)點(diǎn)相關(guān)聯(lián)的鍵。這個(gè)方法返回節(jié)點(diǎn)的  String[]。  除獲取和存儲(chǔ)個(gè)別首選項(xiàng)以及獲取一列關(guān)鍵字之外,您還可以用  clear()、remove()  和  removeNode()  除去節(jié)點(diǎn)和值。 
     
    轉(zhuǎn)儲(chǔ)數(shù)據(jù) 
    如果您想在系統(tǒng)提供的備用存儲(chǔ)器之外保存和恢復(fù)首選項(xiàng),您可以在  XML  格式的文檔中執(zhí)行這些操作。您可以用  exportNode()  導(dǎo)出一個(gè)節(jié)點(diǎn)或用  exportSubtree()  導(dǎo)出整個(gè)子樹。信息以  UTF-8  格式存儲(chǔ)。然后,當(dāng)您想恢復(fù)信息時(shí),可使用  importPreferences()  方法。 
     
    偵聽 
    “好奇心會(huì)害死一只貓”,但如果您對(duì)弄清除首選項(xiàng)何時(shí)改變很感興趣,您可以注冊(cè)一個(gè)  NodeChangeListener  或  PreferenceChangeListener,而不考慮隨之而來的后果。NodeChangeListener  負(fù)責(zé)通知您節(jié)點(diǎn)被添加和除去的時(shí)間,  而  PreferenceChangeListener  告訴您值的變化。這些都緊跟著基本  JavaBeans  組件事件用  add/removeNodeChangeListener(NodeChangeListener)  和  add/removePreferenceChangeListener()  方法處理結(jié)構(gòu)之后發(fā)生。基本上,您先實(shí)現(xiàn)偵聽器,然后注冊(cè)偵聽器,這樣您會(huì)發(fā)現(xiàn)將來的變化。 
     
    完整的示例 
    真的就這些。清單  3  為您提供了一個(gè)完整的示例來試驗(yàn)新功能(也可從參考資料下載)。程序運(yùn)行后會(huì)自己清除,所以如果您想在注冊(cè)表中找到值,請(qǐng)注釋掉程序尾部的清除代碼。 
     
    清單  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 閱讀(680) 評(píng)論(0)  編輯  收藏 所屬分類: Java
    MSN:envoydada@hotmail.com QQ:34935442
    主站蜘蛛池模板: 黄网站在线播放视频免费观看| 国产成人精品日本亚洲专区| 亚洲国产综合精品| 久久久久国产精品免费免费不卡 | 午夜高清免费在线观看| 亚洲精品国产肉丝袜久久| 美丽姑娘免费观看在线观看中文版| 国产国拍亚洲精品mv在线观看| 99免费精品视频| 久久精品国产亚洲夜色AV网站| 中文字幕无码免费久久| 亚洲AV日韩AV鸥美在线观看| 国产成人精品免费久久久久| 亚洲黄色在线电影| 国产精品1024永久免费视频| 亚洲中文字幕久久精品无码A | 国产免费变态视频网址网站| 亚洲AV无码之国产精品| 凹凸精品视频分类国产品免费| 特级毛片爽www免费版| 最新亚洲成av人免费看| 成人爽a毛片免费| 亚洲白色白色永久观看| 免费高清在线爱做视频| 亚洲一区二区三区免费| 亚洲国产精品久久66| 国产麻豆视频免费观看| 国产亚洲精品免费| 亚洲欧洲美洲无码精品VA | 大学生高清一级毛片免费| 久久精品国产亚洲av瑜伽| 久久亚洲2019中文字幕| 91精品导航在线网址免费| 亚洲午夜无码毛片av久久京东热| 亚洲第一黄色网址| 久久伊人免费视频| 亚洲Av永久无码精品黑人| 亚洲成a人片77777kkkk| 免费黄网在线观看| 91视频免费观看| 亚洲欧美日韩综合俺去了|