前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JAVA魔法堂:读取.properties配置文件

JAVA魔法堂:读取.properties配置文件

作者头像
^_^肥仔John
发布2018-01-18 14:31:03
1.4K0
发布2018-01-18 14:31:03
举报

一、前言                              

  Java工程中想log4j、数据库连接等配置信息一般都写在.properties文件中,那么如何读取这些配置信息呢?下面把相关方法记录下来供以后查阅。

二、.properties文件                        

  配置文件的一种,内容以键值对的形式存在,且每个键值对独占一行。#号作为行注释的起始标志,中文注释会自动进行unicode编码。示例:

# ip and port of server socket
ip=127.0.0.1
port=9999
# error message
msg=I'm sorry, bye bye!

  假设上述内容存储在config.properties文件下,且bin目录结果如下:

  bin     |-- main         |-- Demo.class     |-- config.properties

   后续章节的示例将以上述内容作为目标对象来操作。

三、通过 Properties对象 操作                    

读取属性,示例:

public class Demo{
  public static void main(String[] args){
    Properties props = new Properties();
    
    InputStream in = Demo.class.getResourceAsStream("../config.properties");

    // 或使用文件输入流(不推荐),假设当前工作目录为bin
    //InputStream in = new FileInputStream("./config.properties");

    props.load(in);
    in.close();
    
    // 读取特定属性
    String key = "ip";
    String ip = props.getProperty(key);

    // 遍历所有属性,方式一
    Set keys = props.keySet();
    for (Interator it = keys.iterator(); it.hasNext();){
        String k = it.next();
        System.out.println(k + ":" + props.getProperty(k));
    }
     // 遍历所有属性,方式二
    Enumeration en = props.propertyNames();
    while (en.hasMoreElements()){
        String k = en.nextElement();
        System.out.println(k + ":" + props.getProperty(k));
    }
  }
}

   1. 通过 Demo.class.getResourceAsStream("../config.properties"); 读取配置文件,配置文件的相对路径以类文件所在目录作为当前目录。

   2. 通过 new FileInputStream("./config.properties"); 读取配置文件,配置文件的相对路径以工作目录(可以通过 System.getProperty("user.dir") 获取工作目录)作为当前目录。

   注意:上述两种方式获取的配置文件均没有被缓存。每次都要重新加载配置文件。

写属性,示例:

Properties props = new Properties();
InputStream in = getClass().getResouceAsStream("properties文件相对于当前类加载路径的文件目录");
props.load(in);

OutputStream output = new FileOutputStream("properties文件路径");
props.setProperty("ip", "10.248.112.123"); // 修改或新增属性键值对
props.store(output, "modify ip value"); // store(OutputStream output, String comment)将修改结果写入输出流
output.close()

四、通过 ResourceBundle对象 操作                    

  通过该方式仅能读取配置文件而已,不能进行写操作。示例:

// ResourceBundle rb = ResourceBundle.getBundle("配置文件相对工程根目录的相对路径(不含扩展名)");
ResourceBundle rb = ResourceBundle.getBundle("config");
try{
    String name = rb.getString("name");
}
catch(MissingResourceException ex){

注意:上述方式会缓存配置文件信息,后续读取时均是读取缓存中的内容,若在此期间修改了配置内容是无法实时同步的

ResourceBundle有两个子类ListResourceBundle和PropertyResourceBundle,在读取properties文件时实际上是使用PropertyResourceBundle来处理。

题外话:

  ResourceBundle主要用于解决国际化和本地化问题。通过资源命名定义各语言和方言的信息,然乎程序在运行时获取当前本地化信息,并根据本地化信息加载相应的资源完成本地化。

  资源命名规范:

// 仅含家族名
MyResource

// 含家族名和语言
MyResource_en

// 含家族名、语言和国家
MyResource_en_US

  对应的Java代码:

// ResourceBundle首先会根据语言和国家的本地化信息去查找资源(假设现在要查找MyResource_zh_CN),当找不到时就会找MyResource_zh,再找不到就用MyResource。
ResourceBundle rb = ResourceBundle.getBundle("MyResource", Locale.getDefault())

五、总结                              

  当然方式不止这些啦,日后继续补充!

六、参考                              

http://www.cnblogs.com/panjun-Donet/archive/2009/07/17/1525597.html

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2014-09-26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档