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
Properties
类表示了一个持久的属性集。Properties
可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。
一个属性列表可包含另一个属性列表作为它的“默认值”;如果未能在原有的属性列表中搜索到属性键,则搜索第二个属性列表。
因为 Properties
继承于 Hashtable
,所以可对 Properties
对象应用put
和putAll
方法。但不建议使用这两个方法,因为它们允许调用者插入其键或值不是 String
的项。相反,应该使用setProperty
方法。如果在“不安全”的Properties
对象(即包含非 String
的键或值)上调用store
或 save
方法,则该调用将失败。类似地,如果在“不安全”的 Properties
对象(即包含非String
的键)上调用propertyNames
或 list
方法,则该调用将失败。
@L_301_36@ /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) 以适合使用 @L_301_36@ 方法的格式,将此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
-
从输入流中读取属性列表(键和元素对)。输入流按
@L_301_36@ 中所指定的、简单的面向行的格式,并假定使用 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
-
以适合使用
@L_301_36@ 方法的格式,将此
Properties
表中的属性列表(键和元素对)写入输出字符。对于取自此
Properties
表默认表(如果有的话)的属性,此方法不 将其写入 out。如果 comments 变量非 null,则首先将 ASCII
#
字符、注释字符串和一个行分隔符写入输出流。因此,该comments
可用作一个标识注释。注释中换行 ('\n')、回车 ('\r') 或回车后直接跟着换行,这些字符中的任意一个都由Writer
生成的行分隔符替换,如果注释中下一个字符不是#
字符或!
字符,则在该行分隔符后写出 ASCII#
。接下来总是写入一个注释行,该行包括一个 ASCII
#
字符、当前的日期和时间(就好像使用Date
的toString
方法获取当前时间一样)和一个由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 以
\u
xxxx 的形式写入。 - 属性键或值中小于
\u0020
的字符和大于\u007E
的字符针对适当的十六进制值 xxxx 以\u
xxxx 的形式写入。
-
- 参数:
-
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)
Stringencoding) throws IOException
-
使用指定的编码发出一个表示此表中包含的所有属性的 XML 文档。
该 XML 文档要具有以下 DOCTYPE 声明:
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
如果指定的注释为
null
,则没有注释存储在该文档中。此方法返回后,指定的流仍保持打开状态。
-
- 参数:
-
os
- 根据其内容发出 XML 文档的输出流。 -
comment
- 属性列表的描述,如果没有所需的注释,则为null
。 - 抛出:
-
IOException
- 如果写入指定的输出流导致一个 IOException。 -
NullPointerException
- 如果os
为null
,或者encoding
为null
。 -
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 中反映出来,反之亦然。
list
public void list(PrintStreamout)
list
public void list(PrintWriterout)
- 将属性列表输出到指定的输出流。此方法对调试很有用。
-
- 参数:
-
out
- 输出流。 - 抛出:
-
ClassCastException
- 如果此属性列表中的任何键不是字符串。 - 从以下版本开始:
- JDK1.1
|
JavaTM2Platform StandardEd. 6 |
|||||||||
上一个类 下一个类 | 框架 无框架 所有类 | |||||||||
摘要:嵌套|字段|构造方法|方法 | 详细信息:字段|构造方法|方法 |