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类的更多相关文章

  1. Java的Properties类和读取.properties文件

    一..properties文件的作用 Properties属性文件在JAVA应用程序中是经常可以看得见的,也是特别重要的一类文件.它用来配置应用程序的一些信息,不过这些信息一般都是比较少的数据,没有必 ...

  2. Java中Properties类的学习总结

    学习目标: 1.认识properties文件,理解其含义,会正确创建properties文件. 2.会使用java.util.Properties类来操作properties文件. 一.认识prope ...

  3. 使用java.util.Properties类读写配置文件

    J2SE 1.5 以前的版本要求直接使用 XML 解析器来装载配置文件并存储设置,虽说也并非难事,相比 java.util.Properties却要做额外的解析工作.而java.util.Proper ...

  4. Java中Properties类

    1 简介: JDK提供的java.util.Properties类继承自Hashtable类并且实现了Map接口,用map来存储key-value数据,所以存入的数据是无序的.其中键和值都是字符串类型 ...

  5. java.util.Properties类 学习笔记

    学习目标:   1.认识properties文件,理解其含义,会正确创建properties文件. 2.会使用java.util.Properties类来操作properties文件. 3.掌握相对路 ...

  6. Java中Properties类知识的总结

    一.Properties类与配置文件 注意:是一个Map集合,该集合中的键值对都是字符串.该集合通常用于对键值对形式的配置文件进行操作. 配置文件:将软件中可变的部分数据可以定义到一个文件中,方便以后 ...

  7. Java中Properties类的操作

    知识学而不用,就等于没用,到真正用到的时候还得重新再学.最近在看几款开源模拟器的源码,里面涉及到了很多关于Properties类的引用,由于Java已经好久没用了,而这些模拟器大多用Java来写,外加 ...

  8. Java中Properties类的操作配置文件

    知识学而不用,就等于没用,到真正用到的时 候还得重新再学.最近在看几款开源模拟器的源码,里面涉及到了很多关于Properties类的引用,由于Java已经好久没用了,而这些模拟器大多用 Java来写, ...

  9. 对Java中properties类的理解

    转载于:https://www.cnblogs.com/bakari/p/3562244.html 一.Java Properties类 Java中有个比较重要的类Properties(Java.ut ...

  10. java中Properties类及读取properties中属性值

    本文为博主原创,未经允许不得转载: 在项目的应用中,经常将一些配置放入properties文件中,在代码应用中读取properties文件,就需要专门的类Properties类,通过这个类可以进行读取 ...

随机推荐

  1. genymotion安装(unknown generic error)及配置在Android studio环境中

    /*转载请注明出处.本文地址:http://write.blog.csdn.net/postedit/44261371*/ genymotion模拟器的长处我就不阐述了,一个字:快!! .如今来说一下 ...

  2. 兼容火狐,ie8的 js urlencode和urldecode

    function UrlEncode(str)//url编码{ var i,temp,p,q; var result=""; for(i=0;i<str.length;i++ ...

  3. NYOJ-------三角形

    Problem A 三角形 时间限制:1000 ms  |  内存限制:65535 KB   描述 在数学中,如果知道了三个点的坐标,我们就可以判断这三个点能否组成一个三角形:如果可以组成三角形,那么 ...

  4. 推荐系统之 BPR 算法及 Librec的BPR算法实现【1】

    [推荐系统之 BPR 算法] 1.关于BPR的论文原文: BPR: Bayesian Personalized Ranking from Implicit Feedback 2.参考1:论文快读 - ...

  5. UltraEdit打开中文乱码

    http://hellofs.blog.51cto.com/6109153/1187548 UltraEdit很强大,但是今天发现在打开含有中文的文本时会乱码,还是在配置里找找相关的设置,可以在如图的 ...

  6. vsftp添加用户及测试

    上一篇我们讲了vsftp安装以及配置,这篇我们讲下如何添加用户,然后我们测试一下,看看是否成功. 首先说下添加用户,如图执行命令即可: 这里简单解释一下:第一条命令是添加用户,第二条命令是设置用户密码 ...

  7. ASP.NET中UrlEncode应该用Uri.EscapeDataString()

    今天,茄子_2008反馈他博客中的“C++”标签失效.检查了一下代码,生成链接时用的是HttpUtility.UrlEncode(url),从链接地址获取标签时用的是HttpUtility.UrlDe ...

  8. android LinearLayout设置selector不起作用解决

    设置方法 : android:background="@drawable/fen_selector" 如果只有这个的话,是不起作用的.还必须加上: android:clickabl ...

  9. Python max() 方法

    描述 Python max() 方法返回字符串中最大的字母(26个字母中最大的是Z). 语法 max() 方法语法: max(S) 参数 S -- 字符串. 返回值 返回字符串中最大的字母. 实例 以 ...

  10. scikit-learn 入门

    简介: scikit-learn是一个基于NumPy.SciPy.Matplotlib的开源机器学习工具包.採用Python语言编写.主要涵盖分类. 回归和聚类等算法,比如knn.SVM.逻辑回归.朴 ...