Properties类

package com.huiyun.tcp;

import java.io.BufferedInputStream;   
import java.io.FileInputStream;   
import java.io.FileNotFoundException;   
import java.io.FileOutputStream;   
import java.io.FileReader;
import java.io.IOException;   
import java.io.InputStream;   
import java.io.LineNumberReader;
import java.io.OutputStream;   
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.socketException;
import java.net.UnkNownHostException;
import java.util.Properties;   

import com.jack.dbtool.Send;

/**
 * 
 * @author Jack
 * 实现对Java配置文件Properties的读取、写入与更新操作  
 *
 */
public class WriteAndReadProperty {   
    //属性文件的路径    
    static String profilepath="F:/Android工程/2014-04-04/src/cc.Properties";   
      
    //采用静态方法  
    private static Properties props = new Properties();   
    static {   
        try {   
            props.load(new FileInputStream(profilepath));  
        } catch (FileNotFoundException e) {   
            e.printstacktrace();   
            System.exit(-1);   
        } catch (IOException e) {          
            System.exit(-1);   
        }   
    }   
    /**  
    * 读取属性文件中相应键的值  
    * @param key  
    * @return String  
    */   
    public static String getkeyvalue(String key) {   
        return props.getProperty(key);   
    }   
   
	/**  
    * 根据主键key读取主键的值value  
    * @param filePath 属性文件路径  
    * @param key 键名  
    */   
    public static String readValue(String filePath,String key) {   
        Properties props = new Properties();   
        try {   
            InputStream in = new BufferedInputStream(new FileInputStream(   
                    filePath));   
            props.load(in);   
            String value = props.getProperty(key);   
            System.out.println(key +"键的值是:"+ value);   
            return value;   
        } catch (Exception e) {   
            e.printstacktrace();   
            return null;   
        }   
    }   
    /**  
    * 更新(或插入)一对properties信息(主键及其键值)  
    * 如果该主键已经存在,更新该主键的值;  
    * 如果该主键不存在,则插件一对键值。  
    * @param keyname 键名  
    * @param keyvalue 键值  
    */   
    public static void writeProperties(String keyname,String keyvalue) {          
        try {   
            // 调用 Hashtable 的方法 put,使用 getProperty 方法提供并行性。    
            // 强制要求为属性的键和值使用字符串。返回值是 Hashtable 调用 put 的结果。    
            OutputStream fos = new FileOutputStream(profilepath);   
            props.setProperty(keyname,keyvalue);   
            // 以适合使用 load 方法加载到 Properties 表中的格式,    
            // 将此 Properties 表中的属性列表(键和元素对)写入输出流    
            props.store(fos,"Update '" + keyname + "' value");   
        } catch (IOException e) {   
            System.err.println("属性文件更新错误");   
        }   
    }   
    /**  
    * 更新properties文件的键值对  
    * 如果该主键已经存在,更新该主键的值;  
    * 如果该主键不存在,则插件一对键值。  
    * @param keyname 键名  
    * @param keyvalue 键值  
    */   
    public void updateProperties(String keyname,String keyvalue) {   
        try {   
            props.load(new FileInputStream(profilepath));   
            // 调用 Hashtable 的方法 put,使用 getProperty 方法提供并行性。    
            // 强制要求为属性的键和值使用字符串。返回值是 Hashtable 调用 put 的结果。    
            OutputStream fos = new FileOutputStream(profilepath);              
            props.setProperty(keyname,"Update '" + keyname + "' value");   
        } catch (IOException e) {   
            System.err.println("属性文件更新错误");   
        }   
    }   
    
    /**
     * 得到文件行数
     * @param fileName
     */
    private static int getTotalLines(String fileName) throws IOException {
        FileReader in = new FileReader(fileName);
        LineNumberReader reader = new LineNumberReader(in);
        String strLine = reader.readLine();
        int totalLines = 0;
        while (strLine != null) {
            totalLines++;
            strLine = reader.readLine();
        }
        reader.close();
        in.close();
        return totalLines;
    }

    //得到Properties文件中所有的值
    public static String [] getPropertiesValues() throws Exception{
    	//得到有多少行数据
    	int a=getTotalLines(profilepath);
    	System.out.println("有"+a+"行数据");
    	String [] str=new String[a/2+1];
    	for(int i=1;i<=a/2;i++){
    		str[i]=readValue(profilepath,"light_off_"+i);
    	}
		return str;
    }

	/*
	 * 把16进制字符串转换成字节数组 @param hex @return
	 */
	public static byte[] hexStringToByte(String hex) {
		int len = (hex.length() / 2);
		byte[] result = new byte[len];
		char[] achar = hex.tochararray();
		for (int i = 0; i < len; i++) {
			int pos = i * 2;
			result[i] = (byte) (toByte(achar[pos]) << 4 | toByte(achar[pos + 1]));
		}
		return result;
	}
	private static byte toByte(char c) {
		byte b = (byte) "0123456789ABCDEF".indexOf(c);
		return b;
	}
	//得到我们需要的byte数组
	public static byte[] getByte(String str[]){
		byte[] b = new byte[str.length];
		for(int i=0;i<str.length;i++){
			b[i] = hexStringToByte(str[i])[0];
		}
		return b;
	}
	//String 转数组
	public static String [] getString(String str){
		String strs[]=new String[str.length()/2];
		strs = str.split(" ");
		return strs;
	}
    //测试代码    
    public static void main(String[] args) throws Exception {   
    	String [] str=getPropertiesValues();
    	for(int i=1;i<str.length;i++){
    		new UDPSend(getByte(getString(str[i])));
    	}
    	
    }   
}   

JavaTM2Platform
StandardEd. 6

java.util
类 Properties

java.lang.Object
  java.util.Dictionary<K,V>
      java.util.Hashtable<Object,Object>
          java.util.Properties
所有已实现的接口:
Serializable,Cloneable,Map< Object,Object>
直接已知子类:
Provider
public class Properties
   
   
extends Hashtable< Object,Object>
 

Properties 类表示了一个持久的属性集。Properties 可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。

一个属性列表可包含另一个属性列表作为它的“认值”;如果未能在原有的属性列表中搜索属性键,则搜索第二个属性列表。

因为 Properties 继承于 Hashtable,所以可对 Properties 对象应用putputAll 方法。但不建议使用这两个方法,因为它们允许调用者插入其键或值不是 String 的项。相反,应该使用setProperty 方法。如果在“不安全”的Properties 对象(即包含非 String 的键或值)上调用storesave 方法,则该调用将失败。类似地,如果在“不安全”的 Properties 对象(即包含非String 的键)上调用propertyNameslist 方法,则该调用将失败。

load(Reader) /store(Writer,String) 方法按下面所指定的、简单的面向行的格式在基于字符的流中加载和存储属性。除了输入/输出流使用 ISO 8859-1 字符编码外,load(InputStream)/store(OutputStream,String) 方法与 load(Reader)/store(Writer,String) 对的工作方式完全相同。可以使用Unicode 转义来编写此编码中无法直接表示的字符;转义序列中只允许单个 'u' 字符。可使用 native2ascii 工具对属性文件和其他字符编码进行相互转换。

loadFromXML(InputStream)storeToXML(OutputStream,String,String) 方法按简单的 XML 格式加载和存储属性认使用 UTF-8 字符编码,但如果需要,

字段摘要
protected Properties defaults一个属性列表,包含属性列表中所有未找到值的键的认值。
构造方法摘要
Properties()创建一个认值的空属性列表。
Properties(Propertiesdefaults)创建一个带有指定认值的空属性列表。
方法摘要
String getProperty(Stringkey)用指定的键在此属性列表中搜索属性
String getProperty(Stringkey,StringdefaultValue)用指定的键在属性列表中搜索属性
void list(PrintStreamout)属性列表输出到指定的输出流。
void list(PrintWriterout)属性列表输出到指定的输出流。
void load(InputStreaminStream)从输入流中读取属性列表(键和元素对)。
void load(Readerreader)按简单的面向行的格式从输入字符流中读取属性列表(键和元素对)。
void loadFromXML(InputStreamin)将指定输入流中由 XML 文档所表示的所有属性加载到此属性表中。
Enumeration<?> propertyNames()返回属性列表中所有键的枚举,如果在主属性列表中未找到同名的键,则包括属性列表中不同的键。
void save(OutputStreamout,Stringcomments)已过时。如果在保存属性列表时发生 I/O 错误,则此方法不抛出 IOException。保存属性列表的首选方法是通过store(OutputStream out,String comments) 方法storetoXML(OutputStream os,String comment) 方法来进行。
Object setProperty(Stringkey,Stringvalue)调用 Hashtable方法 put
void store(OutputStreamout,Stringcomments)以适合使用 load(InputStream) 方法加载到Properties 表中的格式,将此Properties 表中的属性列表(键和元素对)写入输出流。
void store(Writerwriter,Stringcomments)以适合使用 load(Reader) 方法的格式,将此Properties 表中的属性列表(键和元素对)写入输出字符。
void storeToXML(OutputStreamos,Stringcomment)发出一个表示此表中包含的所有属性的 XML 文档。
void storeToXML(OutputStreamos,Stringcomment,Stringencoding)使用指定的编码发出一个表示此表中包含的所有属性的 XML 文档。
Set<String> stringPropertyNames()返回此属性列表中的键集,其中该键及其对应值是字符串,如果在主属性列表中未找到同名的键,则还包括属性列表中不同的键。
从类 java.util.Hashtable 继承的方法
clear, clone,contains, containsKey,containsValue, elements,entrySet, equals,get, hashCode,isEmpty,keys,keySet,put, putAll,rehash,remove,size, toString,values
从类 java.lang.Object 继承的方法
finalize, getClass,notify, notifyAll,wait, wait,wait

字段详细信息

defaults

protected Properties defaults
一个属性列表,包含属性列表中所有未找到值的键的认值。
构造方法详细信息

Properties

public Properties()
创建一个认值的空属性列表。

Properties

public Properties(Propertiesdefaults)
创建一个带有指定认值的空属性列表。
参数:
defaults - 认值。
方法详细信息

setProperty

public Object setProperty(Stringkey,Stringvalue)
调用 Hashtable方法 put。使用 getProperty 方法提供并行性。强制要求为属性的键和值使用字符串。返回值是 Hashtable 调用 put 的结果。
参数:
key - 要置于属性列表中的键。
value - 对应于 key 的值。
返回:
属性列表中指定键的旧值,如果没有值,则为 null
从以下版本开始:
1.2
另请参见:
getProperty(java.lang.String)

load

public void load(Readerreader)
          throws IOException
按简单的面向行的格式从输入字符流中读取属性列表(键和元素对)。

根据行来处理属性。有两种行,即自然行逻辑行。自然行定义为通过行结束符字符集(\n \r\r\n),或者通过流的结尾来终止的字符行。一个自然行可能是一个空行、注释行,或者保存了全部或部分键-元素对。逻辑行保存了所有键-元素对的数据,可能分散在多个相邻的自然行中,用反斜杠字符\ 转义行结束符序列。注意,不能以此方式扩展注释行;每个内容为注释的自然行必须有其自己的注释指示符,正如下面所描述的。到达流结尾前,将一直从输入中读取各行。

仅包含空白字符的自然行认为是空行并被忽略。注释行以 ASCII 字符 '#''!' 作为其首个非空白字符;注释行也被忽略并且不将其编码为键-元素信息。除了行结束符,此格式还将空格字符(' ''\u0020')、制表符('\t''\u0009')和换页符('\f''\u000C')作为空白。

如果一个逻辑行分散在多个自然行中,则转义行结束符序列的反斜杠、行结束符序列和后续行开始处的任何空白,对键或元素的值都没有影响。后面对键和元素解析的讨论(加载时)将假定移除行继续符后,构成键和元素的所有字符都出现在单个自然行中。注意,仅检查行结束符前面的字符,以便决定行结束符是否已转义是 够的;对于要转义的行结束符,必须有奇数个相邻的反斜杠。由于是从左到右来处理输入内容的,所以行结束符前(或其他位置)非零、偶数 2n 个相邻的反斜杠在转义处理后会被编码成n 个反斜杠。

键包含行中下列区间内的所有字符:从首个非空白字符开始,直到(但不包括)首个非转义的 '='':' 或非行结束符的空白字符。所有这些键终止字符都可能包含在键中,方法是在其前面用反斜杠字符进行转义,例如:

\:\=

将是两字符的键 ":="。可以使用 \r\n 转义序列包括行结束符字符。跳过键后面的所有空白字符;如果键后的首个非空白字符是'='':',则忽略该字符并且跳过其后的所有空白字符。行中所有剩余的字符都成为关联元素字符串的一部分;如果没有剩余的字符,则该元素为空字符串""。一旦标识了组成键和元素的原始字符序列,则如上所述执行转义处理。

作为一个示例,以下三行都指定了键 "Truth" 和关联元素值 "Beauty"

 Truth = Beauty
        Truth:Beauty
 Truth                  :Beauty
 
一个示例,以下三行都指定了单个属性
 fruits                           apple,banana,pear,\
                                  cantaloupe,watermelon,\
                                  kiwi,mango
 
键是 "fruits",关联元素是:
"apple,cantaloupe,kiwi,mango"
注意,在每个 \ 的前面出现了一个空格,这样最后的结果中每个逗号的后面将出现一个空格;会将 \、行结束符和后续行中的前导空白字符简单地丢弃,并且 不会一个或多个其他字符替换它们。

第三个示例,此行:

cheeses
 
指定键是 "cheeses" 并且关联元素是空字符串 ""

以键和元素的形式表示的字符可以使用与字符和字符串字面值所用的类似转义序列表示。(请参阅Java Language Specification§3.3 节 §3.10.6 节)。 字符和字符串所用的字符转义序列和 Unicode 转义的差别有:

  • 不识别八进制转义。
  • 字符序列 \b 表示退格字符。
  • 方法并不将无效转义字符前的反斜杠字符 \ 视为错误;只是将反斜杠丢弃。例如,在 Java 字符串中,序列 "\z" 将导致编译时错误。相反,此方法会丢弃该反斜杠。因此,此方法将两字符序列"\b" 与单字符'b' 视为等同。
  • 转义对于单引号和双引号而言不是必需的;但是根据上面的规则,前面有反斜杠的单引号和双引号字符仍旧分别生成单引号和双引号字符。
  • Uniocde 转义序列中只允许单个 'u' 字符。

方法返回后,指定的流仍保持打开状态。

参数:
reader - 输入字符流。
抛出:
IOException - 如果从输入流读取时发生错误
IllegalArgumentException - 如果输入中出现了错误的 Unicode 转义。
从以下版本开始:
1.6

load

public void load(InputStreaminStream)
          throws IOException
从输入流中读取属性列表(键和元素对)。输入流按 load(Reader) 中所指定的、简单的面向行的格式,并假定使用 ISO 8859-1 字符编码;即每个字节都是 latin1 字符。对于非 latin1 的字符和某些特殊字符,可以使用 Unicode 转义以键和元素的形式来表示它们。

方法返回后,指定的流仍保持打开状态。

参数:
inStream - 输入流。
抛出:
IOException - 如果读取输入流时发生错误
IllegalArgumentException - 如果输入流包含错误的 Unicode 转义序列。
从以下版本开始:
1.2

save

@Deprecated
public void save(OutputStreamout,Stringcomments)
已过时。 如果在保存属性列表时发生 I/O 错误,则此方法不抛出 IOException。保存属性列表的首选方法是通过store(OutputStream out,String comment) 方法来进行。
调用 store(OutputStream out,String comments) 方法并取消抛出的 IOExceptions。
参数:
out - 输出流。
comments - 属性列表的描述。
抛出:
ClassCastException - 如果此 Properties 对象包含任意非 String 的键或值。

store

public void store(Writerwriter,Stringcomments)
           throws IOException
以适合使用 load(Reader) 方法的格式,将此 Properties 表中的属性列表(键和元素对)写入输出字符。

对于取自此 Properties认表(如果有的话)的属性,此方法 将其写入 out。

如果 comments 变量非 null,则首先将 ASCII # 字符、注释字符串和一个行分隔符写入输出流。因此,该 comments 可用作一个标识注释。注释中换行 ('\n')、回车 ('\r') 或回车后直接跟着换行,这些字符中的任意一个都由 Writer 生成的行分隔符替换,如果注释中下一个字符不是# 字符或! 字符,则在该行分隔符后写出 ASCII #

接下来总是写入一个注释行,该行包括一个 ASCII # 字符、当前的日期和时间(就好像使用 DatetoString 方法获取当前时间一样)和一个Writer 生成的行分隔符。

然后将此 Properties 表中的所有项写入 out,一次一行。对于每个项而言,先写入键字符串,然后是一个 ASCII =,最后是关联元素字符串。对于键,所有写入的空白字符前面都有一个 \ 字符。对于元素,所有写入的前导空白字符(但是不嵌入或尾随空白字符)前面都有一个\ 字符。所有写入的键和元素字符#!=: 前面都有反斜杠,确保能正确地加载这些字符。

写入各个项后,刷新输出流。此方法返回后,输出流仍保持打开状态。

参数:
writer - 输出字符流 writer。
comments - 属性列表的描述。
抛出:
IOException - 如果将此属性列表写入指定的输出流时抛出 IOException
ClassCastException - 如果此 Properties 对象包含任何不是 String 的键或值。
NullPointerException - 如果 writer 为 null。
从以下版本开始:
1.6

store

public void store(OutputStreamout,Stringcomments)
           throws IOException
以适合使用 load(InputStream) 方法加载到 Properties 表中的格式,将此 Properties 表中的属性列表(键和元素对)写入输出流。

方法 编写此 Properties认表的属性(如果有)。

方法store(Writer) 中指定的相同格式输出注释、属性键和值,注意以下几点不同:

  • 使用 ISO 8859-1 字符编码写入该流。
  • 注释中不是 Latin-1 的字符针对其适当的十六进制值 xxxx\uxxxx 的形式写入。
  • 属性键或值中小于 \u0020 的字符和大于 \u007E 的字符针对适当的十六进制值 xxxx\uxxxx 的形式写入。

写入各个项后,刷新输出流。此方法返回后,输出流仍保持打开状态。

参数:
out - 输出流。
comments - 属性列表的描述。
抛出:
IOException - 如果将此属性列表写入指定的输出流时,抛出 IOException
ClassCastException - 如果此 Properties 对象包含任意非 String 的键或值。
NullPointerException - 如果 out 为 null。
从以下版本开始:
1.2

loadFromXML

public void loadFromXML(InputStreamin)
                 throws IOException,InvalidPropertiesFormatException
将指定输入流中由 XML 文档所表示的所有属性加载到此属性表中。

该 XML 文档必须具有以下 DOCTYPE 声明:

 <!DOCTYPE properties SYstem "http://java.sun.com/dtd/properties.dtd">
 
而且该文档还必须满足上述属性 DTD 的要求。

方法返回后,指定的流已关闭

参数:
in - 从中读取 XML 文档的输入流。
抛出:
IOException - 如果读取指定的输入流导致 IOException
InvalidPropertiesFormatException - 输入流中的数据没有按要求的文档类型组成有效的 XML 文档。
NullPointerException - 如果 in 为 null。
从以下版本开始:
1.5
另请参见:
storeToXML(OutputStream,String)

storetoXML

public void storetoXML(OutputStreamos,Stringcomment)
                throws IOException
发出一个表示此表中包含的所有属性的 XML 文档。

props.storetoXML(os,comment) 的形式调用方法的行为与调用 props.storetoXML(os,comment,"UTF-8"); 完全相同。

参数:
os - 根据其内容发出 XML 文档的输出流。
comment - 属性列表的描述,如果没有所需的注释,则为 null
抛出:
IOException - 如果写入指定的输出流导致一个 IOException
NullPointerException - 如果 os 为 null。
ClassCastException - 如果此 Properties 对象包含任何不是 String 的键或值。
从以下版本开始:
1.5
另请参见:
loadFromXML(InputStream)
etoXML(java.io.OutputStream,java.lang.String,Stringencoding) throws IOException
使用指定的编码发出一个表示此表中包含的所有属性的 XML 文档。

该 XML 文档要具有以下 DOCTYPE 声明:

 <!DOCTYPE properties SYstem "http://java.sun.com/dtd/properties.dtd">
 

如果指定的注释为 null,则没有注释存储在该文档中。

方法返回后,指定的流仍保持打开状态。

参数:
os - 根据其内容发出 XML 文档的输出流。
comment - 属性列表的描述,如果没有所需的注释,则为 null
抛出:
IOException - 如果写入指定的输出流导致一个 IOException
NullPointerException - 如果 osnull,或者 encodingnull
ClassCastException - 如果 Properties 对象包含任何不是 String 的键或值。
从以下版本开始:
1.5
另请参见:
loadFromXML(InputStream)

getProperty

public String getProperty(Stringkey)
用指定的键在此属性列表中搜索属性。如果在此属性列表中未找到该键,则接着递归检查属性列表及其认值。如果未找到属性,则此方法返回 null
参数:
key - 属性键。
返回:
属性列表中具有指定键值的值。
另请参见:
setProperty(java.lang.String,java.lang.String),defaults

getProperty

public String getProperty(Stringkey,StringdefaultValue)
用指定的键在属性列表中搜索属性。如果在属性列表中未找到该键,则接着递归检查属性列表及其认值。如果未找到属性,则此方法返回认值变量。
参数:
key - 哈希表键。
defaultValue - 认值。
返回:
属性列表中具有指定键值的值。
另请参见:
setProperty(java.lang.String,defaults

propertyNames

public Enumeration<?> propertyNames()
返回属性列表中所有键的枚举,如果在主属性列表中未找到同名的键,则包括属性列表中不同的键。
返回:
属性列表中所有键的枚举,包括属性列表中的键。
抛出:
ClassCastException - 如果此属性列表中的任何键不是一个字符串。
另请参见:
Enumeration,defaults,stringPropertyNames()

stringPropertyNames

public Set<String> stringPropertyNames()
返回此属性列表中的键集,其中该键及其对应值是字符串,如果在主属性列表中未找到同名的键,则还包括属性列表中不同的键。其键或值不是 String 类型的属性被忽略。

返回的 set 不受 Properties 对象支持。对此 Properties 的改变不能在该 set 中反映出来,反之亦然。

返回:
属性列表中的键集,其中该键及其对应值是字符串,包括属性列表中的键。
从以下版本开始:
1.6
另请参见:
defaults

list

public void list(PrintStreamout)
属性列表输出到指定的输出流。此方法对调试很有用。
参数:
out - 输出流。
抛出:
ClassCastException - 如果此属性列表中的任何键不是字符串。

list

public void list(PrintWriterout)
属性列表输出到指定的输出流。此方法对调试很有用。
参数:
out - 输出流。
抛出:
ClassCastException - 如果此属性列表中的任何键不是字符串。
从以下版本开始:
JDK1.1
JavaTM2Platform
StandardEd. 6

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念
xml文件介绍及使用
xml编程(一)-xml语法
XML文件结构和基本语法
第2章 包装类
XML入门的常见问题(二)
Java对象的强、软、弱和虚引用
JS解析XML文件和XML字符串详解
java中枚举的详细使用介绍
了解Xml格式
XML入门的常见问题(四)
深入SQLite多线程的使用总结详解
PlayFramework完整实现一个APP(一)
XML和YAML的使用方法
XML轻松学习总节篇