java.util.Properties

java.util.Properties 继承了 java.util.Hashtable<Object, Object>
基本用法是new Properties()再调用load方法读取相应的配置文件

package com.demon.test.testProperties;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Properties;

public class Demo {

    public static void main(String[] args) throws FileNotFoundException, IOException {
        Properties properties = new Properties();
//      properties.load(inStream);  //调用load(InputStream inStream);//从流中读入配置文件
//      properties.load(reader);    //调用load(Reader reader);//从流中读入配置文件
//      properties.loadFromXML(in); //调用loadFromXML(InputStream in)//从流中读入xml格式配置文件
//      properties.store(out, comments);    //调用store(OutputStream out, String comments)//输出配置文件到流
        
        properties.load(new FileInputStream("properties_InputStream"));
        properties.store(System.out, "show this properties  1");
        
        properties.load(new  FileReader("properties_Reader"));
        properties.store(System.out, "show this properties  2");
        
        properties.loadFromXML(new FileInputStream("XML_properties_InputStream"));
        properties.store(System.out, "show this properties  3");
    }
}

输出如下:

#show this properties  1
#Mon Dec 25 17:52:12 CST 2017
name=demon
#show this properties  2
#Mon Dec 25 17:52:12 CST 2017
age=123
name=demon
#show this properties  3
#Mon Dec 25 17:52:12 CST 2017
age=123
name=demon.li
key=value

读入的三个配置文件内容为:
properties_InputStream:

name = demon

properties_Reader

name = demon
age = 123

XML_properties_InputStream

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
    <entry key="name">demon.li</entry>
    <entry key="key">value</entry>
</properties>

1.输入

Properties 从流中读入配置时调用的三个方法:

    public synchronized void load(Reader reader) throws IOException {
        load0(new LineReader(reader));
    }
    public synchronized void load(InputStream inStream) throws IOException {
        load0(new LineReader(inStream));
    }
    public synchronized void loadFromXML(InputStream in)
        throws IOException, InvalidPropertiesFormatException
    {
        XmlSupport.load(this, Objects.requireNonNull(in));
        in.close();
    }

可以看到,load(Reader reader)load(InputStream inStream)是为load0 (LineReader lr)方法做了代理,分析load(InputStream inStream)方法和Properties$LineReader内部类,可以看到,load0 (LineReader lr)调用了lr.readLine()方法从流中解析出一行有效的配置,再解析成对应的key和value,调用Object java.util.Hashtable.put(Object key, Object value)将解析出来的key-value添加到自身(Hashtable)中

//java.util.Properties.load0(LineReader)
String key = loadConvert(lr.lineBuf, 0, keyLen, convtBuf);
String value = loadConvert(lr.lineBuf, valueStart, limit - valueStart, convtBuf);
put(key, value);

loadFromXML(InputStream in)方法调用了java.util.Properties.XmlSupport.load(Properties, InputStream)最终调用的是sun.util.spi.XmlPropertiesProvider.load(Properties arg0, InputStream arg1)方法,相对复杂但是从使用效果上看,和load是保持一致的,最后还是会将解析出来的key-value添加到自身去。
这种设计可以同时load多个配置文件,先load的配置有可能被覆盖
要修改或增加配置,最好调用java.util.Properties.setProperty(String, String)方法,即使它只是做了代理

    public synchronized Object setProperty(String key, String value) {
        return put(key, value);
    }

2.输出

Properties提供了list、save、store一系列方法帮助我们将配置写入输出流中,具体方法请alt+/
其中java.util.Properties.save(OutputStream, String)方法已废弃,可以看到它代理了java.util.Properties.store(OutputStream, String)方法,我们使用时直接调用store系列方法即可
java.util.Properties.store(OutputStream, String)java.util.Properties.store(Writer, String)方法是java.util.Properties.store0(BufferedWriter, String, boolean)方法的代理,从源码可以看出该方法遍历打印了所有的key-value,list方法也大同小异

    private void store0(BufferedWriter bw, String comments, boolean escUnicode)
        throws IOException
    {
        if (comments != null) {
            writeComments(bw, comments);
        }
        bw.write("#" + new Date().toString());
        bw.newLine();
        synchronized (this) {
            for (Enumeration<?> e = keys(); e.hasMoreElements();) {
                String key = (String)e.nextElement();
                String val = (String)get(key);
                key = saveConvert(key, true, escUnicode);
                /* No need to escape embedded and trailing spaces for value, hence
                 * pass false to flag.
                 */
                val = saveConvert(val, false, escUnicode);
                bw.write(key + "=" + val);
                bw.newLine();
            }
        }
        bw.flush();
    }

java.util.Properties.storeToXML(OutputStream, String)java.util.Properties.storeToXML(OutputStream, String, String)这两个方法和java.util.Properties.loadFromXML(InputStream)方法一样,最后最为调用的是sun.util.spi.XmlPropertiesProvider.store(Properties arg0, OutputStream arg1, String arg2, String arg3)方法,效果和java.util.Properties.store(OutputStream, String)java.util.Properties.store(Writer, String)方法保持一致。

两个list方法和两个store方法类似。

补充:需要注意,properties.load进去后,输入流不会被关闭,在读取完配置文件后,应该手动关闭掉输入流

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • /Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home...
    光剑书架上的书阅读 3,854评论 2 8
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,580评论 18 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,560评论 18 399
  • 一. Java基础部分.................................................
    wy_sure阅读 3,785评论 0 11
  • 黑本(20170921) 山川信是金堂美,潋滟沱江水。 乡音能够几回来?便使竹筒倒豆更开怀。 木兰营里谈文化,韧干...
    黑本儿阅读 182评论 0 1