`

操作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 

分享到:
评论

相关推荐

    xml、excel、txt、property文件的解析

    本文将深入探讨XML、Excel、TXT和Property文件的解析方法,并重点介绍使用Dom4j和JDOM等技术进行XML解析。 首先,XML(eXtensible Markup Language)是一种用于标记数据的语言,广泛用于数据交换和配置文件。它的...

    Properties文件读写;Property文件读写;Property

    在Java编程语言中,Properties文件...在实际项目中,`property文件处理_V1.0`可能是一个包含`PropertyUtil.java`源代码和示例用法的库。开发人员可以导入这个库,快速集成Properties文件的读写功能,从而提升开发效率。

    Java 操作 Property 文件

    用 java 读取或写入 property

    java读取和保存property文件(可含中文)

    Property文件是Java中用于存储键值对的标准格式,通常以`.properties`为扩展名。这些文件可以包含纯文本信息,包括英文和中文,这对于国际化(i18n)的应用程序尤其重要。本篇文章将详细介绍如何在Java中读取和保存...

    java对property文件的操作

    ### Java对Property文件的操作 #### 一、概述 在Java开发中,经常需要读取配置文件来进行环境变量的设定或数据库连接等初始化工作。其中,`.properties`文件因其灵活且易于阅读的特点而被广泛采用。Java标准库提供...

    eclipse插件-property

    7. **比较和合并**:对于多语言版本的`.properties`文件,插件可能支持比较不同语言版本的差异,并进行合并操作。 8. **版本控制集成**:与Eclipse的版本控制系统(如Git)无缝集成,方便团队协作,查看历史修改...

    WinForm PropertyGrid用法

    `PropertyGrid`还提供了一些事件,如`ValueChanged`和`GridChanged`,可以监听用户在`PropertyGrid`中所做的更改,并据此执行相应的操作。 ### 7. 应用到自定义类 如果你想让用户通过`PropertyGrid`编辑自定义类的...

    操作init文件的源码

    - **删除操作**:从`Section`或ini文件中移除指定的`Property`,或者整个`Section`。 在实际编程中,这样的源码可能会提供API,例如`IniFile::load()`加载文件,`IniFile::save()`保存文件,`IniFile::findSection...

    doc2docx 文件类型转换 java后台

    Apache POI提供了HPSF(Hierarchical Property Set Format)和HWPF(Horrible Word Processor Format)等组件,分别用于处理DOC和DOCX文件。 在实际的转换过程中,可能的步骤包括: 1. 使用HWPF读取DOC文件:首先,...

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

    在Microsoft Foundation Classes (MFC)库中,"MFC单文档文件对话框propertysheet设置"涉及到的是创建和管理一个多页对话框的应用程序设计。Propertysheet(属性表)是Windows GUI中常见的一种界面元素,它允许用户...

    eclipse编辑property插件

    Property文件是Java应用程序中常见的资源文件,用来存储字符串、消息或者其他与本地化相关的数据。 描述简短地提到了“eclipse插件”,这暗示我们将讨论的是如何在Eclipse中安装和使用特定的插件来增强对....

    Spring@PropertySource 配置文件自定义加密、自定义Yaml文件加载

    在Spring框架中,`@PropertySource`注解用于指定配置文件的位置,以便Spring可以在启动时自动加载这些属性值。在实际开发中,我们有时需要对这些配置文件进行加密,以增强系统的安全性。此外,除了传统的.properties...

    PropertyGrid控件使用教程

    运行这个文件可以更直观地了解控件的使用方式和功能。 总结起来,PropertyGrid控件是.NET开发中一个强大的工具,能够快速创建直观且功能丰富的设置界面。通过合理的属性标记和事件处理,我们可以创建出符合业务需求...

    WPF PropertyGrid的资料合集

    包含的多个ZIP文件(如“WPFPropertyGrid.rar”、“PropertyGrid_vc2010.zip”等)可能包含了使用`PropertyGrid`的示例项目和源代码。这些示例可以帮助你快速理解如何在实际项目中集成和自定义`PropertyGrid`,包括...

    WinForm属性编辑 propertyGrid示例 仿window

    这些特性可以改变属性的显示方式,提供更丰富的编辑体验,比如选择日期、颜色、文件路径等。 在本示例"CustomerSetProperty"中,很可能展示了如何利用`propertyGrid`来编辑一个名为`CustomerSet`的类的实例。这个类...

    java-property-utils-1.9.jar

    Java属性工具库(Java Property Utils)是一个常用的Java开发中的组件,主要用来处理和操作Java的系统属性和配置文件。在Java编程中,属性文件通常用于存储应用的配置信息,如数据库连接字符串、日志级别等。`java-...

    C#修改文件属性摘要信息

    在C#编程中,修改文件属性的摘要信息通常涉及到对文件元数据的操作。这包括诸如作者、标题、创建日期等信息。在这个过程中,我们需要利用Windows操作系统提供的COM接口,特别是ole32.dll库中的功能。ole32.dll是系统...

    C#自定义Property.7z

    标题提到的"C#自定义Property"主要涉及到如何自定义PropertyGrid来处理列表类型的属性,以便在界面上更友好地显示和操作。 在描述中,提到了一个常见问题:当属性是列表(如List)时,通常需要通过展开省略号(......

    Property设置属性的7种方法

    在IT领域,特别是软件开发与项目构建过程中,`Property`设置是极其常见且重要的操作。本文将深入探讨“Property设置属性的7种方法”,旨在帮助开发者理解和掌握多种灵活的属性配置方式,从而提升项目的可配置性和...

    Eclipse 插件propertyEdit

    Eclipse 插件propertyEdit是专为Eclipse集成开发环境设计的一款实用工具,它主要功能是提供一个方便、直观的方式来查看和编辑项目中的属性文件。属性文件在Java开发中广泛使用,它们通常以.properties为扩展名,用于...

Global site tag (gtag.js) - Google Analytics