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

一、前言

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

二、.properties文件

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

# ip and port of server socket

ip=127.0.0.1port=9999# error message

msg=I'm sorry, bye bye!

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

bin

|-- main

|-- Demo.class

|-- config.properties

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

三、通过 Properties对象 操作

读取属性,示例:

public classDemo{public static voidmain(String[] args){

Properties props= newProperties();

InputStreamin = 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 = newProperties();

InputStreamin = 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值