`

操作property文件(转)

    博客分类:
  • java
 
阅读更多

对于一些常量我们经常放到property属性文件中.
今天在对其的存取过程中遇到了些问题:
1:取的时候掉了内容
2:取出后出现乱码

首先,我们的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:取的时候掉了内容的解决:
当然我这个文件有些特殊,主要是针对跳转下拉菜单的数据设计(用户在日后扩展数据的时候只需在后面直接添加,但必须以","号分开).
在开始我以如下方法来取:

 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)
     * 两个参数应该有相同的长度
     
 */ 

    
 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显示的时候得到的results的长度为2,也就是只取出了文件中的百度1,百度2(乱码解决后才知道是这二个啦).在Eclipse中调试的时候发在getLinks方法中的for循环确实少执行了次!为什么?(搞不懂!郁闷了半天),不得不将此方法的代码加长些(真受不了)

 /** 
     * 
 @param  titleargs 存放链接名称的StringTokenizer
     * 
 @param  linkargs 存放链接地址的StringTokenizer
     * return hashmap(title,link)
     * 两个参数应该有相同的长度
     
 */ 

    
 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;
    }

这简直一样的处理啊?为什么结果会不同呢?

2:乱码处理
乱码其实简单,只是开始的时候没注意罢了.我们的机器编码应该是GBK方式的,而在JVM程序中读取Property文件的时候使用的是Unicode编码方式,(我的这些处理过程也没对编码文件请求进行过滤),所以我们可以对其进行对应的编码.
我是利用了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


当然你不可能对着一大堆的16进制看吧,所以可以通过 -reverse 来解码.
native2ascii -reverse  sourcefilename  destfilename 

本人觉得对于大量文本的处理,比如说整个项目的国际化,这样可以通过对整个文件编码来处理,但若只是为了一个下拉框,就显得有些大材小用了(再说对用户来说,他们也得多一步去执行项目里的脚本代码).所以我们可以在叠代标题(这些就是"百度")StringTokenizer的时候对其重新编码.这时可用将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"对应的分别是源编码与目标编码方式.

关于native2ascii的详细用法,可以参考相关文档,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 

分享到:
评论

相关推荐

    Java 操作 Property 文件

    用 java 读取或写入 property

    java对property文件的操作

    java对property文件写入、读取操作

    java的property配置文件的用法.txt

    JDK 内置的 Java.util.Properties 类为我们操作 .properties 文件提供了便利。 一. .properties 文件的形式 # 以下为服务器、数据库信息 dbPort = localhost databaseName = mydb dbUserName = root ...

    MFC单文档文件对话框propertysheet设置

    MFC实现对话框设置。使用页propertysheet,实现上一步,下一步,完成等操作。

    c#操作ini文件的类库

    c#操作ini文件的类库,实现了读取节点,节点赋值,读取节点的所有键值,删除节点、删除键、删除ini文件,创建ini文件等功能。可以直接开箱即用。ini文件结构: 节(section) 节用方括号括起来,单独占一行,例如: ...

    操作init文件的源码

    一个简单的操作init文件的源码,里面包含了对init文件的读写,查找,删除等操作。

    Mycat实现mysql主从读写分离的配置文件

    这是Mycat实现mysql主从读写分离时用到的的配置文件。 内容包括:schema.xml和server.xml。 请根据实际情况替换里面的数据库地址、用户、密码。 相关操作教程:...

    JavaScript中对象property的读取和写入方法介绍

    JavaScript中,可以通过点号操作符”.”或者中括号操作符”[]“来对对象的property进行读取和写入: 代码如下: var o = {x:1, y:2}; console.log(o.x);//1 console.log(o[“y”]);//2 o.y = 7; console.log(o[“y...

    java小工具(批量产生代码,生成pojo,hibernate配置文件等)

    于是试着动手写了一个可以把数据库表自动写成pojo类,并且产生hibernate配置文件。虽然不是什么比较高级的程序,但是我希望也能对大家有一些帮助。不要吃我当时的闭门羹,算是给朋友们,提供一个思路吧。 备注:运行...

    文件的移动,删除,复制

    刚做好的一个从property文件读取文件的开始路径和目的路径,并对其目录的所有文件进行删除、复制、移动操作,简单好用!

    log4j中配置日志文件相对路径方法分析

    这样,我们就可以在log4j加载配置文件之前,先用System.setProperty ("WORKDIR", WORKDIR);设置好根路径,此操作可通过一初始的servlet进行。 方法二、 可以使用服务器环境变量 log4j的配置文件支持服务器的vm的...

    Qt操作excel文件,基于QAxObject的封装,适用windows系统.zip

    构建项目时,MOC工具读取C++源文件,当它发现类的定义里有Q_OBJECT宏时,它就会为这个类生成另外一个包含有元对象支持代码的C++源文件,这个生成的源文件连同类的实现文件一起被编译和连接。 除了信号和槽机制外,...

    NTFS文件系统规范

    NTFS作为Microsoft Windows NT®操作系统的标配文件系统克服了FAT/FAT32文件系统的大量缺点;同时又随着Microsoft Windows 2000®、Microsoft Windows XP操作系统的推广得到越来越广泛的应用。 和FAT/FAT32文件系统...

    使用boost读取XML文件详细介绍

    boost中提供了对配置文件读取的支持,它就是:property_tree。  basic_ptree 是property_tree的核心基础。其接口像std::list。可以执行很多基本的元素操作,比如使用begin()、end()等。  此外还加入了操作属性树...

    springmvcmybatis

    &lt;property name="initialSize" value="${jdbc.initialSize}"&gt;&lt;/property&gt; 连接池最大数量 &lt;property name="maxActive" value="${jdbc.maxActive}"&gt;&lt;/property&gt; 连接池最大空闲 &lt;property name="maxIdle" ...

    数据库课设,java课设都可用,小型超市商品管理系统 课程设计

    下载后文件根目录下有两个GIF图,分别描述管理员操作和顾客操作 大概使用说明: 1、数据库使用MySQL 2、图形界面使用java的JFrame 3、导入数据看:将supermarketdb.sql文件导入数据库中后 4、修改项目根目录下的...

    基于Java web SSH框架的电影后台管理系统(源码+数据库).zip

    - [x] baseDao定义泛型抽象出基本dao操作 ## 导入项目 ### 导入SQL文件 进入到db文件夹,将ssh.sql文件导入到数据库中 ### 修改数据库密码 修改hibernate.cfg.xml文件 ```xml &lt;property name="hibernate....

    unicode-property-escapes-tests:测试RegExp Unicode属性转义

    test262-harness --test262Dir= " $HOME /projects/test262 " --hostPath= " $HOME /.jsvu/v8 " --hostType=d8 --hostArgs= ' --harmony-regexp-property ' $( find output -name ' *.js ' ) --threads=4 ...

    DWR.xml配置文件说明书(含源码)

    Singatures配置允许我们对DWR要操作的对象类型进行配置.对于了解JDK5泛型编程的开发人员来说下面的格式是很容易理解的. &lt;![CDATA[ import java.util.List; import com.example.Check; Check.setLotteryResults...

    基于j2ee struct+tomcat简单的学生信息管理系统(实现struct构架中的多语言控制和tiles技术控制页面排版)

    并且在项目中实现了多语言的控制,控制property文件显示不通的语言。项目很小,但是基本上一些j2ee上的主流的技术都用到了。对数据库方面的操作室采用bean文件操作。没有使用第三方的工具。项目中含有数据库的脚本,...

Global site tag (gtag.js) - Google Analytics