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

          JAVA訪問(wèn)注冊(cè)表

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

          JDK1.4下實(shí)現(xiàn)訪問(wèn)WIN32注冊(cè)表 
          (通過(guò)  JSR  10)為  Java  1.4  增加的  java.util.prefs  包,通過(guò)提供對(duì)特定于實(shí)現(xiàn)的注冊(cè)表(例如,Windows  平臺(tái)上的  Windows  注冊(cè)表)的訪問(wèn)能力,使您能夠操作用戶首選項(xiàng)數(shù)據(jù)和配置數(shù)據(jù)。 
          您是不是曾經(jīng)需要保存程序的配置數(shù)據(jù)但卻不知應(yīng)將數(shù)據(jù)存儲(chǔ)在哪里?  雖然您可以使用屬性文件或資源束獲取這些信息,但  Java  平臺(tái)從未指定過(guò)用于存儲(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è)表自由控制,但您的確可以通過(guò)一個(gè)公共根節(jié)點(diǎn)訪問(wèn)所有的應(yīng)用程序。 
           
          開(kāi)始 
          命名很恰當(dāng)?shù)?nbsp; Preferences  類提供操作首選項(xiàng)的基本框架。這個(gè)類提供了一系列靜態(tài)和抽象方法來(lá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)的抽象方法來(lái)做這項(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è)表把樹(shù)形結(jié)構(gòu)中的鍵組織起來(lái))。可它不是“集合框架”(  Collections  Framework)的部件,(關(guān)于“集合框架”的更多信息,請(qǐng)參閱參考資料)。 
           
          寫數(shù)據(jù) 
          我們將從討論如何存儲(chǔ)首選項(xiàng)開(kāi)始。Preferences  類提供一系列  put()  方法,如下所示,用于存儲(chǔ)值。除支持基本的字符串之外,您還可以存儲(chǔ)布爾值、雙精度數(shù)、浮點(diǎn)數(shù)、整型數(shù)、長(zhǎng)整型數(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)的鍵長(zhǎng)度被限制為  Preferences.MAX_KEY_LENGTH(80)個(gè)字符,而它的值被限制為  Preferences.MAX_VALUE_LENGTH(8192)個(gè)字符。 
           
          讀數(shù)據(jù) 
          可通過(guò)下面所示的一系列  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è)子樹(shù)。信息以  UTF-8  格式存儲(chǔ)。然后,當(dāng)您想恢復(fù)信息時(shí),可使用  importPreferences()  方法。 
           
          偵聽(tīng) 
          “好奇心會(huì)害死一只貓”,但如果您對(duì)弄清除首選項(xiàng)何時(shí)改變很感興趣,您可以注冊(cè)一個(gè)  NodeChangeListener  或  PreferenceChangeListener,而不考慮隨之而來(lái)的后果。NodeChangeListener  負(fù)責(zé)通知您節(jié)點(diǎn)被添加和除去的時(shí)間,  而  PreferenceChangeListener  告訴您值的變化。這些都緊跟著基本  JavaBeans  組件事件用  add/removeNodeChangeListener(NodeChangeListener)  和  add/removePreferenceChangeListener()  方法處理結(jié)構(gòu)之后發(fā)生。基本上,您先實(shí)現(xiàn)偵聽(tīng)器,然后注冊(cè)偵聽(tīng)器,這樣您會(huì)發(fā)現(xiàn)將來(lái)的變化。 
           
          完整的示例 
          真的就這些。清單  3  為您提供了一個(gè)完整的示例來(lái)試驗(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 閱讀(675) 評(píng)論(0)  編輯  收藏 所屬分類: Java
          MSN:envoydada@hotmail.com QQ:34935442
          主站蜘蛛池模板: 蓝山县| 金坛市| 慈利县| 阿拉善左旗| 集贤县| 都匀市| 辉南县| 渝中区| 定州市| 上林县| 湖北省| 丹寨县| 洪江市| 许昌市| 金川县| 平泉县| 塔河县| 台北县| 旬邑县| 桃园市| 湛江市| 靖宇县| 凉山| 马边| 闻喜县| 平罗县| 荣成市| 容城县| 城口县| 望奎县| 台南市| 南昌市| 寻甸| 讷河市| 思茅市| 文化| 吉首市| 泾阳县| 中卫市| 合作市| 河东区|