关于Java的Properties类
Properties类
先来学习下Properties类吧。
Properties 类表示了一个持久的属性集。Properties 可保存在流中或从流中加载。
属性列表中每个键及其对应值都是一个字符串。
一个属性列表可包含另一个属性列表作为它的“默认值”;
如果未能在原有的属性列表中搜索到属性键,则搜索第二个属性列表。
我感觉我怎么听不懂这句话是什么意思呢?暂时先不管了吧
因为 Properties 继承于 Hashtable,所以它仍可以当作一个HashTable看咯。
构造方法
Properties()
创建一个无默认值的空属性列表。
Properties(Properties defaults)
创建一个带有指定默认值的空属性列表。
常规方法
String getProperty(String key)
用指定的键在此属性列表中搜索属性。
String getProperty(String key, String defaultValue)
用指定的键在属性列表中搜索属性。
void list(PrintStream out)
将属性列表输出到指定的输出流。
void list(PrintWriter out)
将属性列表输出到指定的输出流。
void load(InputStream inStream)
从输入流中读取属性列表(键和元素对)。
void loadFromXML(InputStream in)
将指定输入流中由 XML 文档所表示的所有属性加载到此属性表中。
Enumeration<?> propertyNames()
返回属性列表中所有键的枚举,如果在主属性列表中未找到同名的键,则包括默认属性列表中不同的键。
void save(OutputStream out, String comments)
已过时。 如果在保存属性列表时发生 I/O 错误,则此方法不抛出 IOException。
保存属性列表的首选方法是通过 store(OutputStream out, String comments) 方法或 storeToXML(OutputStream os, String comment) 方法来进行。
Object setProperty(String key, String value)
调用 Hashtable 的方法 put。
void store(OutputStream out, String comments)
以适合使用 load 方法加载到 Properties 表中的格式,将此 Properties 表中的属性列表(键和元素对)写入输出流。
void storeToXML(OutputStream os, String comment)
发出一个表示此表中包含的所有属性的 XML 文档。
void storeToXML(OutputStream os, String comment, String encoding)
使用指定的编码发出一个表示此表中包含的所有属性的 XML 文档。
在上面的这些方法中load方法比较重要,现着重把这个方法作以下的说明。
1、对于输入流的处理
此方法根据行来处理输入。通过行结束符字符集(\n 或 \r 或 \r\n),或者通过文件的结尾来终止输入的自然行。
一个自然行可能是一个空行、注释行或保存了键-元素对的某些部分。
2、如果有键值对的长度超过了一行
保存所有键-元素对数据的逻辑行可能分散在多个相邻的自然行中,方法是用反斜杠字符 \ 转义行结束符序列。
注意,不能以此方式扩展注释行;每个内容为注释的自然行必须有其自己的注释指示符,正如下面所描述的。
如果一个逻辑行延伸到多个自然行上,那么这些连续的行会接受进一步的处理,这也在下面描述。
到达文件结尾前,会一直从输入流中读取各行。
3、注释和空白的处理
仅包含空白字符的自然行认为是空行并被忽略。
注释行以 ASCII 字符 '#' 或 '!' 作为其首个非空白字符;
注释行也被忽略并且不将其编码为键-元素信息。
除了行结束符,此方法还将空格字符(' ','\u0020')、制表符('\t','\u0009')和换页符('\f','\u000C')作为空白。
4、转义和续行
如果一个逻辑行分散在多个自然行中,则转义行结束符序列的反斜杠、行结束符序列和后续行开始处的任何空白,对键或元素的值都没有影响。
后面对键和元素分析的讨论将假定移除行继续符后,构成键和元素的所有字符都出现在单个自然行中。
注意,仅检查行结束符前面的字符,以便查看行结束符是否已转义是不够的;对于要转义的行结束符,必须有奇数个相邻的反斜杠。
由于是从左到右来处理输入内容的,所以行结束符前(或其他位置)非零、偶数 2n 个相邻的反斜杠在转义处理后会被编码成 n 个反斜杠。
5、键值对的读取
键包含行中下列区间内的所有字符:从首个非空白字符开始,直到(但不包括)首个非转义的 '='、 ':' 或非行结束符的空白字符。
所有这些键终止字符都可能包含在键中,方法是在其前面用反斜杠字符进行转义,例如:
\:\=
将是两字符的键 ":="。可以使用 \r 和 \n 转义序列包括行结束符字符。跳过键后面的所有空白字符;
如果键后的首个非空白字符是 '=' 或 ':',则忽略该字符并且跳过其后的所有空白字符。
行中所有剩余的字符都成为关联元素字符串的一部分;如果没有剩余的字符,则该元素为空字符串 ""。
一旦标识了组成键和元素的原始字符序列,则如上所述执行转义处理。
键值对处理的示例
示例1:
作为一个示例,以下三行都指定了键 "Truth" 和关联元素值 "Beauty":
Truth = Beauty
Truth:Beauty
Truth :Beauty
示例2:
另一个示例,以下三行都指定了单个属性:
fruits apple, banana, pear, \
cantaloupe, watermelon, \
kiwi, mango
键是 "fruits",关联元素是:
"apple, banana, pear, cantaloupe, watermelon, kiwi, mango"注意,在每个 \ 的前面出现了一个空格,
这样最后的结果中每个逗号的后面将出现一个空格;
会将 \、行结束符和后续行中的前导空白字符简单地丢弃,并且不会 用一个或多个其他字符替换它们。
示例3:
现在有一行如下:
cheeses
指定键是 "cheeses" 并且关联元素是空字符串 ""。
load会抛出的错误为:
IOException - 如果读取输入流时发生错误。
IllegalArgumentException - 如果输入流包含错误的 Unicode 转义序列。
下面则三个代码示例都来源于这位作者的博客,我处于学习的目的就引过来了,见如下链接:
http://www.cnblogs.com/bakari/p/3562244.html
代码实例:
实例1:用来读取java JVM的信息
package com.Properties.test;
import java.util.Properties;
public class ReadJVM {
public static void main(String[] args) {
Properties prop = System.getProperties();
// System.out.println(prop); // 不要用这种方式打印,结果都在一行上
// 下面这种方式不错
prop.list(System.out);
}
}
读出来的结果如下所示:
-- listing properties --
java.runtime.name=Java(TM) SE Runtime Environment
sun.boot.library.path=D:\Program Files\Java\jdk1.8.0_73\jre...
java.vm.version=25.73-b02
java.vm.vendor=Oracle Corporation
java.vendor.url=http://java.oracle.com/
path.separator=;
java.vm.name=Java HotSpot(TM) 64-Bit Server VM
file.encoding.pkg=sun.io
user.script=
user.country=CN
sun.java.launcher=SUN_STANDARD
sun.os.patch.level=
java.vm.specification.name=Java Virtual Machine Specification
user.dir=D:\spider\test
java.runtime.version=1.8.0_73-b02
java.awt.graphicsenv=sun.awt.Win32GraphicsEnvironment
java.endorsed.dirs=D:\Program Files\Java\jdk1.8.0_73\jre...
os.arch=amd64
java.io.tmpdir=C:\Users\tuhooo\AppData\Local\Temp\
line.separator=
java.vm.specification.vendor=Oracle Corporation
user.variant=
os.name=Windows 7
sun.jnu.encoding=GBK
java.library.path=D:\Program Files\Java\jdk1.8.0_73\bin...
java.specification.name=Java Platform API Specification
java.class.version=52.0
sun.management.compiler=HotSpot 64-Bit Tiered Compilers
os.version=6.1
user.home=C:\Users\tuhooo
user.timezone=
java.awt.printerjob=sun.awt.windows.WPrinterJob
file.encoding=GBK
java.specification.version=1.8
user.name=tuhooo
java.class.path=D:\spider\test\bin;D:\spider\test\lib...
java.vm.specification.version=1.8
sun.arch.data.model=64
java.home=D:\Program Files\Java\jdk1.8.0_73\jre
sun.java.command=com.Properties.test.ReadJVM
java.specification.vendor=Oracle Corporation
user.language=zh
awt.toolkit=sun.awt.windows.WToolkit
java.vm.info=mixed mode
java.version=1.8.0_73
java.ext.dirs=D:\Program Files\Java\jdk1.8.0_73\jre...
sun.boot.class.path=D:\Program Files\Java\jdk1.8.0_73\jre...
java.vendor=Oracle Corporation
file.separator=\
java.vendor.url.bug=http://bugreport.sun.com/bugreport/
sun.cpu.endian=little
sun.io.unicode.encoding=UnicodeLittle
sun.desktop=windows
sun.cpu.isalist=amd64
实例2:从文件读入键值对
下面有个文件如下所示,现在要读进去
#正常的键值对
name=JJ
Weight=4444
Height=3333
!奇葩的键值对
\:\==Linux
#分布在多行上的
haha = C \
C++
Truth1 = Beauty1
#以冒号为分隔符
Truth2:Beauty2
Truth3 :Beauty3
#以非换行的空白符为分隔
fruits apple, banana, pear, \
cantaloupe, watermelon, \
kiwi, mango
package com.Properties.test; import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Properties; public class getProp {
public static void main(String[] args) throws FileNotFoundException, IOException {
Properties prop = new Properties();
prop.load(new FileInputStream("test.prop"));
// 这里有个警告,说Enumeration这里是粗糙的类型
Enumeration enum1 = prop.propertyNames();//得到配置文件的名字
while(enum1.hasMoreElements()) {
// 作强制类型转换
String strKey = (String) enum1.nextElement();
// 获取键对应的值
String strValue = prop.getProperty(strKey);
System.out.println(strKey + "=" + strValue);
}
}
}
读出来的结果也并不是按照原来的顺序排列的
name=JJ
Height=3333
:==Linux
Truth3=Beauty3
Truth2=Beauty2
Truth1=Beauty1
fruits=apple, banana, pear, cantaloupe, watermelon, kiwi, mango
haha=C C++
Weight=4444
实例3:Properties的综合操作
package com.Properties.test; import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import java.util.Properties; //关于Properties类常用的操作
public class maniProp {
//根据Key读取Value
public static String GetValueByKey(String filePath, String key) {
Properties pps = new Properties();
try {
InputStream in = new BufferedInputStream (new FileInputStream(filePath));
pps.load(in);
String value = pps.getProperty(key);
System.out.println(key + " = " + value);
return value; }catch (IOException e) {
e.printStackTrace();
return null;
}
} //读取Properties的全部信息
public static void GetAllProperties(String filePath) throws IOException {
Properties pps = new Properties();
InputStream in = new BufferedInputStream(new FileInputStream(filePath));
pps.load(in);
Enumeration en = pps.propertyNames(); //得到配置文件的名字 while(en.hasMoreElements()) {
String strKey = (String) en.nextElement();
String strValue = pps.getProperty(strKey);
System.out.println(strKey + "=" + strValue);
}
} //写入Properties信息
public static void WriteProperties (String filePath, String pKey, String pValue) throws IOException {
Properties pps = new Properties(); InputStream in = new FileInputStream(filePath);
//从输入流中读取属性列表(键和元素对)
pps.load(in);
//调用 Hashtable 的方法 put。使用 getProperty 方法提供并行性。
//强制要求为属性的键和值使用字符串。返回值是 Hashtable 调用 put 的结果。
OutputStream out = new FileOutputStream(filePath);
pps.setProperty(pKey, pValue);
//以适合使用 load 方法加载到 Properties 表中的格式,
//将此 Properties 表中的属性列表(键和元素对)写入输出流
pps.store(out, "Update " + pKey + " name");
} public static void main(String [] args) throws IOException{
// 创建对象,然后将文件读进来,放到Properties中
// 再利用Properties的类进行操作
String value = GetValueByKey("test.prop", "name");
System.out.println(value);
GetAllProperties("test.prop");
WriteProperties("test.prop","long", "212");
}
}
TO END
关于Java的Properties类的更多相关文章
- Java的Properties类和读取.properties文件
一..properties文件的作用 Properties属性文件在JAVA应用程序中是经常可以看得见的,也是特别重要的一类文件.它用来配置应用程序的一些信息,不过这些信息一般都是比较少的数据,没有必 ...
- Java中Properties类的学习总结
学习目标: 1.认识properties文件,理解其含义,会正确创建properties文件. 2.会使用java.util.Properties类来操作properties文件. 一.认识prope ...
- 使用java.util.Properties类读写配置文件
J2SE 1.5 以前的版本要求直接使用 XML 解析器来装载配置文件并存储设置,虽说也并非难事,相比 java.util.Properties却要做额外的解析工作.而java.util.Proper ...
- Java中Properties类
1 简介: JDK提供的java.util.Properties类继承自Hashtable类并且实现了Map接口,用map来存储key-value数据,所以存入的数据是无序的.其中键和值都是字符串类型 ...
- java.util.Properties类 学习笔记
学习目标: 1.认识properties文件,理解其含义,会正确创建properties文件. 2.会使用java.util.Properties类来操作properties文件. 3.掌握相对路 ...
- Java中Properties类知识的总结
一.Properties类与配置文件 注意:是一个Map集合,该集合中的键值对都是字符串.该集合通常用于对键值对形式的配置文件进行操作. 配置文件:将软件中可变的部分数据可以定义到一个文件中,方便以后 ...
- Java中Properties类的操作
知识学而不用,就等于没用,到真正用到的时候还得重新再学.最近在看几款开源模拟器的源码,里面涉及到了很多关于Properties类的引用,由于Java已经好久没用了,而这些模拟器大多用Java来写,外加 ...
- Java中Properties类的操作配置文件
知识学而不用,就等于没用,到真正用到的时 候还得重新再学.最近在看几款开源模拟器的源码,里面涉及到了很多关于Properties类的引用,由于Java已经好久没用了,而这些模拟器大多用 Java来写, ...
- 对Java中properties类的理解
转载于:https://www.cnblogs.com/bakari/p/3562244.html 一.Java Properties类 Java中有个比较重要的类Properties(Java.ut ...
- java中Properties类及读取properties中属性值
本文为博主原创,未经允许不得转载: 在项目的应用中,经常将一些配置放入properties文件中,在代码应用中读取properties文件,就需要专门的类Properties类,通过这个类可以进行读取 ...
随机推荐
- Tomcat路径下目录的介绍
本文转自:http://blog.csdn.net/u013132035/article/details/54949593 下图是TOMCAT的路径下目录的截图. 目录有:backup. ...
- VC6.0设置注释快捷键
第一步:工具栏上右键选择Customize(定制),选择“Add-ins and Macro Files(附加项和宏文件)”页,把SAMPLE前面打上钩. 第二步:选择“Commands(命令)”页, ...
- Android开发之Button事件实现方法的总结
下面介绍Button事件实现的两种方法 main.xml <?xml version="1.0" encoding="utf-8"?> <Li ...
- 关于JavaScript中Get/Set访问器
有时候大家可能会纳闷,在使用JavaScript的时候,只需要给一个系统变量赋值就可以触发一系列操作去相应. 但是我们在写Js的时候,修改了一个自定义变量,却连个P都没有.是不是很郁闷呢? 其实,我们 ...
- python学习笔记——高阶函数map()
满足以下两点中任意一点,即为高阶函数: 1.函数接收一个或多个函数作为参数 2.函数返回一个函数 1 描述 用函数和可迭代对象中每一个元素作为参数,计算出新的迭代对象 map() 会根据提供的函数对指 ...
- Python学习笔记010——递归函数
1 递归定义 函数直接或间接调用函数本身,则该函数称为递归函数 2 递归特点 Python函数递归调用,会用到栈 – 这里的栈是函数/程序运行时系统为其分配的一段内存区 – 栈具有 后进先出 的特性 ...
- failed to load selinux policy freezing
一.原因: 在修改selinux配置文件时输入并保存了一个错误的配置参数. 二.挽救: 1. 重启系统. 2. 在启动选项上按 e. 3. 进入grub编辑页面. 4. 向下移动光标至fi下一行. 5 ...
- Asp.net 用户控件和自定义控件注册
在ASPX页中注册用户控件的方法 <%@ Register Src="ListPicker.ascx" TagName="ListPicker" Tag ...
- javascript怎么禁用浏览器后退按钮
1. <script language="JavaScript"> javascript:window.history.forward(1); </scri ...
- 统计svn 代码提交情况
统计svn代码提交,使用工具 statsvn.jar 下载地址:http://sourceforge.net/projects/statsvn/ rem 声明一个时间变量 作为文件名 %time:~, ...