JAVA

          人生若只如初見,何事秋風(fēng)悲畫扇。

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            50 隨筆 :: 25 文章 :: 157 評(píng)論 :: 0 Trackbacks

          對(duì)于一些常量我們經(jīng)常放到property屬性文件中.
          今天在對(duì)其的存取過程中遇到了些問題:
          1:取的時(shí)候掉了內(nèi)容
          2:取出后出現(xiàn)亂碼

          首先,我們的property文件大約如下:

          #友情鏈接
          news.link.inner.href?= http:
          // www.baidu.com, http://www.baidu.com , http://www.baidu.com
          new .link.inner.title? = 百度1,百度2,百度3


          1:取的時(shí)候掉了內(nèi)容的解決:
          當(dāng)然我這個(gè)文件有些特殊,主要是針對(duì)跳轉(zhuǎn)下拉菜單的數(shù)據(jù)設(shè)計(jì)(用戶在日后擴(kuò)展數(shù)據(jù)的時(shí)候只需在后面直接添加,但必須以","號(hào)分開).
          在開始我以如下方法來取:

          private ? void ?initiallink()
          ????
          {
          ????????String?innerlinkstr?
          = ? null ;
          ????????String?innertitlestr?
          = ? null ;
          ????????String?outerlinkstr?
          = ? null ;
          ????????String?outertitlestr?
          = ? null ;
          ????????
          ????????StringTokenizer?innerlink?
          = ? null ;
          ????????StringTokenizer?innertitle?
          = ? null ;
          ????????StringTokenizer?outerlink?
          = ? null ;
          ????????StringTokenizer?outertitle?
          = ? null ;
          ????????
          ????????InputStream?in?
          = ? this .getClass().getResourceAsStream( " /conf/netedu.properties " );
          ????????
          try ? {
          ????????????
          try ? {
          ????????????????Properties?props?
          = ? new ?Properties();
          ????????????????props.load(in);
          ????????????????innerlinkstr?
          = ?props.getProperty( " news.link.inner.href " );
          ????????????????innertitlestr?
          = ?props.getProperty( " new.link.inner.title " );
          ????????????????outerlinkstr?
          = ?props.getProperty( " news.link.outer.href " );
          ????????????????outertitlestr?
          = ?props.getProperty( " new.link.outer.title " );
          ????????????????
          ????????????????innerlink?
          = ? new ?StringTokenizer(innerlinkstr, " , " );
          ????????????????innertitle?
          = ? new ?StringTokenizer(innertitlestr, " , " );
          ????????????????outerlink?
          = ? new ?StringTokenizer(outerlinkstr, " , " );
          ????????????????outertitle?
          = ? new ?StringTokenizer(outertitlestr, " , " );
          ????????????????
          ????????????????innermap
          = ? this .getlinks(innertitle,innerlink);
          ????????????????outermap?
          = ? this .getlinks(outertitle,outerlink);
          ????????????????
          ????????????}

          ????????????
          finally ? {
          ????????????????in.close();
          ????????????}

          ????????}

          ????????
          catch ?(Exception?ex)? {
          ????????????log.debug(
          " Error?to?read?property?in?/conf/netedu.properties?file " );
          ????????}

          ????}

          getLinks的方法如下:

          /**
          ?????*?
          @param ?titleargs?存放鏈接名稱的StringTokenizer
          ?????*?
          @param ?linkargs?存放鏈接地址的StringTokenizer
          ?????*?return?hashmap(title,link)
          ?????*?兩個(gè)參數(shù)應(yīng)該有相同的長(zhǎng)度
          ?????
          */

          ????
          private ?HashMap?getlinks(StringTokenizer?titles,?StringTokenizer?links)
          ????
          {
          ????????HashMap?results?
          = ? new ?HashMap();
          ????????
          ????????
          for ( int ?i = 0 ;i < titles.countTokens();i ++ )
          ????????????results.put((String)titles.nextElement(),(String)links.nextElement());
          ????????
          return ?results;
          ????}

          但到JSP顯示的時(shí)候得到的results的長(zhǎng)度為2,也就是只取出了文件中的百度1,百度2(亂碼解決后才知道是這二個(gè)啦).在Eclipse中調(diào)試的時(shí)候發(fā)在getLinks方法中的for循環(huán)確實(shí)少執(zhí)行了次!為什么?(搞不懂!郁悶了半天),不得不將此方法的代碼加長(zhǎng)些(真受不了)

          /**
          ?????*?
          @param ?titleargs?存放鏈接名稱的StringTokenizer
          ?????*?
          @param ?linkargs?存放鏈接地址的StringTokenizer
          ?????*?return?hashmap(title,link)
          ?????*?兩個(gè)參數(shù)應(yīng)該有相同的長(zhǎng)度
          ?????
          */

          ????
          private ?HashMap?getlinks(StringTokenizer?titles,?StringTokenizer?links)
          ????
          {
          ????????HashMap?results?
          = ? new ?HashMap();
          ????????
          int ?len? = ?titles.countTokens();
          ????????String[]?temp1?
          = ? new ?String[len];
          ????????String[]?temp2?
          = ? new ?String[len];
          ????????????
          ????????
          for ( int ?i = 0 ;i < len;i ++ )
          ????????
          {
          ????????????temp1[i]?
          = ?(String)titles.nextElement();
          ????????????temp2[i]?
          = ?(String)links.nextElement();
          ????????}

          ????????
          ????????
          for ( int ?i = 0 ;i < len;i ++ )
          ????????
          {
          ????????????results.put(temp1[i],temp2[i]);
          ????????}

          ????????
          ????????
          return ?results;
          ????}

          這簡(jiǎn)直一樣的處理啊?為什么結(jié)果會(huì)不同呢?

          2:亂碼處理
          亂碼其實(shí)簡(jiǎn)單,只是開始的時(shí)候沒注意罷了.我們的機(jī)器編碼應(yīng)該是GBK方式的,而在JVM程序中讀取Property文件的時(shí)候使用的是Unicode編碼方式,(我的這些處理過程也沒對(duì)編碼文件請(qǐng)求進(jìn)行過濾),所以我們可以對(duì)其進(jìn)行對(duì)應(yīng)的編碼.
          我是利用了JDK自帶的native2ascii.exe工具.
          通過--encoding 來指定其編碼方式
          native2ascii -encoding GBK sourcefilename? destfilename?
          這樣你在
          InputStream?in?=?this.getClass().getResourceAsStream("/conf/netedu.properties");
          語句中用到的/conf/netedu.properties文件就是destfilename?來代替就OK了

          只是這樣你看到的可能是如下的一些代碼:

          #\u5385\u5185\u94fe\u63a5 ----- \u7528,\u9694\u5f00
          news.link.inner.href?http:
          // www.baidu.com, http://www.baidu.com , http://www.baidu.com
          new .link.inner.title?\u767e\u5ea61,\u767e\u5ea62,\u767e\u5ea63


          當(dāng)然你不可能對(duì)著一大堆的16進(jìn)制看吧,所以可以通過 -reverse 來解碼.
          native2ascii -reverse? sourcefilename? destfilename?

          本人覺得對(duì)于大量文本的處理,比如說整個(gè)項(xiàng)目的國(guó)際化,這樣可以通過對(duì)整個(gè)文件編碼來處理,但若只是為了一個(gè)下拉框,就顯得有些大材小用了(再說對(duì)用戶來說,他們也得多一步去執(zhí)行項(xiàng)目里的腳本代碼).所以我們可以在疊代標(biāo)題(這些就是"百度")StringTokenizer的時(shí)候?qū)ζ渲匦戮幋a.這時(shí)可用將getLinks()方法中的

          ? for ( int ?i = 0 ;i < len;i ++ )
          ????????
          {
          ????????????temp1[i]?
          = ?(String)titles.nextElement();
          ????????????temp2[i]?
          = ?(String)links.nextElement();
          ????????}

          改成

          for ( int ?i = 0 ;i < len;i ++ )
          ????????
          {
          ????????????String?s?
          = ?(String)titles.nextElement();
          ????????????
          try ? {
          ????????????????temp1[i]?
          = ? new ?String(s.getBytes( " ISO-8859-1 " ), " GBK " );
          ????????????}
          ? catch ?(UnsupportedEncodingException?e)? {
          ????????????????e.printStackTrace();
          ????????????}

          ????????????temp2[i]?
          = ?(String)links.nextElement();
          ????????}

          注意:"ISO-8859-1"與"GBK"對(duì)應(yīng)的分別是源編碼與目標(biāo)編碼方式.

          關(guān)于native2ascii的詳細(xì)用法,可以參考相關(guān)文檔,as this:
          native2ascii?-?Native-to-ASCII?Converter
          Converts?a?file?with?native-encoded?characters?(characters?which?are?non-Latin?1?and?non-Unicode)?to?one?with?Unicode-encoded?characters.?
          SYNOPSIS
          native2ascii?[options]?[inputfile?[outputfile]]

          DESCRIPTION
          The?Java?compiler?and?other?Java?tools?can?only?process?files?which?contain?Latin-1?and/or?Unicode-encoded?(\udddd?notation)?characters.?native2ascii?converts?files?which?contain?other?character?encodings?into?files?containing?Latin-1?and/or?Unicode-encoded?charaters.?
          If?outputfile?is?omitted,?standard?output?is?used?for?output.?If,?in?addition,?inputfile?is?omitted,?standard?input?is?used?for?input.?

          OPTIONS
          -reverse?
          Perform?the?reverse?operation:?convert?a?file?with?Latin-1?and/or?Unicode?encoded?characters?to?one?with?native-encoded?characters.?


          -encoding?encoding_name?
          Specify?the?encoding?name?which?is?used?by?the?conversion?procedure.?The?default?encoding?is?taken?from?System?property?file.encoding.?The?encoding_name?string?must?be?a?string?taken?from?the?first?column?of?the?table?below.?


          -------------------------------------------------------------

          Converter????????Description
          Class
          -------------------------------------------------------------

          8859_1???????????ISO?8859-1
          8859_2???????????ISO?8859-2
          8859_3???????????ISO?8859-3
          8859_4???????????ISO?8859-4
          8859_5???????????ISO?8859-5
          8859_6???????????ISO?8859-6
          8859_7???????????ISO?8859-7
          8859_8???????????ISO?8859-8
          8859_9???????????ISO?8859-9
          Big5?????????????Big5,?Traditional?Chinese
          CNS11643?????????CNS?11643,?Traditional?Chinese
          Cp037????????????USA,?Canada(Bilingual,?French),?Netherlands,
          ???????????????????????????????Portugal,?Brazil,?Australia
          Cp1006???????????IBM?AIX?Pakistan?(Urdu)
          Cp1025???????????IBM?Multilingual?Cyrillic:?Bulgaria,?Bosnia,
          ???????????????????????????????Herzegovinia,?Macedonia(FYR)
          Cp1026???????????IBM?Latin-5,?Turkey
          Cp1046???????????IBM?Open?Edition?US?EBCDIC
          Cp1097???????????IBM?Iran(Farsi)/Persian
          Cp1098???????????IBM?Iran(Farsi)/Persian?(PC)
          Cp1112???????????IBM?Latvia,?Lithuania
          Cp1122???????????IBM?Estonia
          Cp1123???????????IBM?Ukraine
          Cp1124???????????IBM?AIX?Ukraine
          Cp1125???????????IBM?Ukraine?(PC)
          Cp1250???????????Windows?Eastern?European
          Cp1251???????????Windows?Cyrillic
          Cp1252???????????Windows?Latin-1
          Cp1253???????????Windows?Greek
          Cp1254???????????Windows?Turkish
          Cp1255???????????Windows?Hebrew
          Cp1256???????????Windows?Arabic
          Cp1257???????????Windows?Baltic
          Cp1258???????????Windows?Vietnamese
          Cp1381???????????IBM?OS/2,?DOS?People's?Republic?of?China?(PRC)
          Cp1383???????????IBM?AIX?People's?Republic?of?China?(PRC)
          Cp273????????????IBM?Austria,?Germany
          Cp277????????????IBM?Denmark,?Norway
          Cp278????????????IBM?Finland,?Sweden
          Cp280????????????IBM?Italy
          Cp284????????????IBM?Catalan/Spain,?Spanish?Latin?America
          Cp285????????????IBM?United?Kingdom,?Ireland
          Cp297????????????IBM?France
          Cp33722??????????IBM-eucJP?-?Japanese?(superset?of?5050)
          Cp420????????????IBM?Arabic
          Cp424????????????IBM?Hebrew
          Cp437????????????MS-DOS?United?States,?Australia,?New?Zealand,
          ???????????????????????????????South?Africa
          Cp500????????????EBCDIC?500V1
          Cp737????????????PC?Greek
          Cp775????????????PC?Baltic
          Cp838????????????IBM?Thailand?extended?SBCS
          Cp850????????????MS-DOS?Latin-1
          Cp852????????????MS-DOS?Latin-2
          Cp855????????????IBM?Cyrillic
          Cp857????????????IBM?Turkish
          Cp860????????????MS-DOS?Portuguese
          Cp861????????????MS-DOS?Icelandic
          Cp862????????????PC?Hebrew
          Cp863????????????MS-DOS?Canadian?French
          Cp864????????????PC?Arabic
          Cp865????????????MS-DOS?Nordic
          Cp866????????????MS-DOS?Russian
          Cp868????????????MS-DOS?Pakistan
          Cp869????????????IBM?Modern?Greek
          Cp870????????????IBM?Multilingual?Latin-2
          Cp871????????????IBM?Iceland
          Cp874????????????IBM?Thai
          Cp875????????????IBM?Greek
          Cp918????????????IBM?Pakistan(Urdu)
          Cp921????????????IBM?Latvia,?Lithuania?(AIX,?DOS)
          Cp922????????????IBM?Estonia?(AIX,?DOS)
          Cp930????????????Japanese?Katakana-Kanji?mixed?with?4370?UDC,
          ???????????????????????????????superset?of?5026
          Cp933????????????Korean?Mixed?with?1880?UDC,?superset?of?5029
          Cp935????????????Simplified?Chinese?Host?mixed?with?1880?UDC,
          ???????????????????????????????superset?of?5031
          Cp937????????????Traditional?Chinese?Host?miexed?with?6204?UDC,
          ?????????????????????????&n0

          posted on 2006-03-11 20:17 Jkallen 閱讀(2095) 評(píng)論(1)  編輯  收藏 所屬分類: JEE學(xué)習(xí)

          評(píng)論

          # re: 操作property文件 2006-11-06 12:13 電腦教程
          學(xué)習(xí)ing..^_^真是高手阿??!  回復(fù)  更多評(píng)論
            

          主站蜘蛛池模板: 上林县| 许昌县| 定边县| 乌兰察布市| 涡阳县| 溆浦县| 大宁县| 荆门市| 东乡县| 蓝田县| 乌鲁木齐市| 定兴县| 油尖旺区| 班玛县| 蕉岭县| 长宁县| 临澧县| 罗田县| 平陆县| 丁青县| 姜堰市| 贵德县| 高碑店市| 临高县| 房山区| 始兴县| 米脂县| 娄底市| 镇巴县| 昌都县| 达孜县| 余庆县| 龙胜| 健康| 鄂伦春自治旗| 宜宾市| 宝山区| 昌图县| 大姚县| 聊城市| 全椒县|