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的信息

  1. package com.Properties.test;
  2.  
  3. import java.util.Properties;
  4.  
  5. public class ReadJVM {
  6. public static void main(String[] args) {
  7. Properties prop = System.getProperties();
  8. // System.out.println(prop); // 不要用这种方式打印,结果都在一行上
  9. // 下面这种方式不错
  10. prop.list(System.out);
  11. }
  12. }

读出来的结果如下所示:
-- 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

  1. package com.Properties.test;
  2.  
  3. import java.io.FileInputStream;
  4. import java.io.FileNotFoundException;
  5. import java.io.IOException;
  6. import java.util.Enumeration;
  7. import java.util.Properties;
  8.  
  9. public class getProp {
  10. public static void main(String[] args) throws FileNotFoundException, IOException {
  11. Properties prop = new Properties();
  12. prop.load(new FileInputStream("test.prop"));
  13. // 这里有个警告,说Enumeration这里是粗糙的类型
  14. Enumeration enum1 = prop.propertyNames();//得到配置文件的名字
  15. while(enum1.hasMoreElements()) {
  16. // 作强制类型转换
  17. String strKey = (String) enum1.nextElement();
  18. // 获取键对应的值
  19. String strValue = prop.getProperty(strKey);
  20. System.out.println(strKey + "=" + strValue);
  21. }
  22. }
  23. }

读出来的结果也并不是按照原来的顺序排列的

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的综合操作

  1. package com.Properties.test;
  2.  
  3. import java.io.BufferedInputStream;
  4. import java.io.FileInputStream;
  5. import java.io.FileOutputStream;
  6. import java.io.IOException;
  7. import java.io.InputStream;
  8. import java.io.OutputStream;
  9. import java.util.Enumeration;
  10. import java.util.Properties;
  11.  
  12. //关于Properties类常用的操作
  13. public class maniProp {
  14. //根据Key读取Value
  15. public static String GetValueByKey(String filePath, String key) {
  16. Properties pps = new Properties();
  17. try {
  18. InputStream in = new BufferedInputStream (new FileInputStream(filePath));
  19. pps.load(in);
  20. String value = pps.getProperty(key);
  21. System.out.println(key + " = " + value);
  22. return value;
  23.  
  24. }catch (IOException e) {
  25. e.printStackTrace();
  26. return null;
  27. }
  28. }
  29.  
  30. //读取Properties的全部信息
  31. public static void GetAllProperties(String filePath) throws IOException {
  32. Properties pps = new Properties();
  33. InputStream in = new BufferedInputStream(new FileInputStream(filePath));
  34. pps.load(in);
  35. Enumeration en = pps.propertyNames(); //得到配置文件的名字
  36.  
  37. while(en.hasMoreElements()) {
  38. String strKey = (String) en.nextElement();
  39. String strValue = pps.getProperty(strKey);
  40. System.out.println(strKey + "=" + strValue);
  41. }
  42. }
  43.  
  44. //写入Properties信息
  45. public static void WriteProperties (String filePath, String pKey, String pValue) throws IOException {
  46. Properties pps = new Properties();
  47.  
  48. InputStream in = new FileInputStream(filePath);
  49. //从输入流中读取属性列表(键和元素对)
  50. pps.load(in);
  51. //调用 Hashtable 的方法 put。使用 getProperty 方法提供并行性。
  52. //强制要求为属性的键和值使用字符串。返回值是 Hashtable 调用 put 的结果。
  53. OutputStream out = new FileOutputStream(filePath);
  54. pps.setProperty(pKey, pValue);
  55. //以适合使用 load 方法加载到 Properties 表中的格式,
  56. //将此 Properties 表中的属性列表(键和元素对)写入输出流
  57. pps.store(out, "Update " + pKey + " name");
  58. }
  59.  
  60. public static void main(String [] args) throws IOException{
  61. // 创建对象,然后将文件读进来,放到Properties中
  62. // 再利用Properties的类进行操作
  63. String value = GetValueByKey("test.prop", "name");
  64. System.out.println(value);
  65. GetAllProperties("test.prop");
  66. WriteProperties("test.prop","long", "212");
  67. }
  68. }

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. Android获取屏幕大小和设置无标题栏

    android获取屏幕大小非常常用,例如写个程序,如果要做成通用性很强的程序,适用屏幕很强,一般布局的时候都是根据屏幕的长宽来定义的,所以我把这个总结一下,方便日后忘记的时候查阅.还有就是有时候写程序 ...

  2. C# 调节图片亮度

    原文地址:https://www.cnblogs.com/wjr408/p/6727118.html 昨天去客户那里测试,需求才开始,所以很简单,就是测一下能不能接受到视频或图片,然后保存下来,现场客 ...

  3. pythonl练习笔记——multiprocessing 多进程拷贝文件

    分两份拷贝文件,父进程拷贝文件的前半部分,子进程拷贝文件的后半部分. import os import time #获取文件大小 size = os.path.getsize('wait.py') # ...

  4. android自动弹出软键盘(输入键盘)

        很多应用中对于一个界面比如进入搜索界面或者修改信息等等情况,为了用户体验应该自动弹出软键盘而不是让用户主动点击输入框才弹出(因为用户进入该界面必然是为了更改信息).具体实现这种效果如下: [代 ...

  5. HDU 5092 DP

    DP水题 求从上到下走完,使所取得权值最小,并输出路径,若有多个满足,则输出靠右的 #include "stdio.h" #include "string.h" ...

  6. Scanner类nextInt方法的使用注意点

    一.先看一段正常的代码 1. 一段用Scanner捕获键盘输入的代码: Scanner sc = new Scanner(System.in); // 先读取键盘输入的字符串 System.out.p ...

  7. [转]Google 全球 IP 地址库

    IP 地址来源:http://www.kookle.co.nr Bulgaria 93.123.23.1 93.123.23.2 93.123.23.3 93.123.23.4 93.123.23.5 ...

  8. python标准库介绍——23 UserString 模块详解

    ==UserString 模块== (2.0 新增) ``UserString`` 模块包含两个类, //UserString// 和 //MutableString// . 前者是对标准字符串类型的 ...

  9. win10环境配置react

    1 react 需要nodejs所以需要安装nodejs环境,到nodejs官网下载 现在默认会安装nodejs 和 npm包 和 配置环境 2 检查是否安装成功,在命令行中输入 显示成功则正确 3 ...

  10. MongoDB索引原理

    转自:http://www.mongoing.com/archives/2797 为什么需要索引? 当你抱怨MongoDB集合查询效率低的时候,可能你就需要考虑使用索引了,为了方便后续介绍,先科普下M ...