转载:读取.properties配置文件

一、前言                              

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/fsjohnhuang/p/3995386.html  ^_^肥仔John

 

六、参考                              

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

java路径问题-getClass().getResourceAsStream()

src(源文件夹)

┣━11.properties

┗━myspider(myspider包)

┣━22.properties
┗━Test.java

 

Java代码  收藏代码
  1. package myspider;
  2. import java.io.UnsupportedEncodingException;
  3. /**
  4.  *
  5.  * @author mark
  6.  */
  7. public class Test {
  8.     public static void main(String[] args) throws UnsupportedEncodingException{
  9.         Test t=new Test();
  10.         //文件名前不加“/”,则表示从当前类所在的包下查找该资源。如下则表示的是从包myspider下查找22.properties文件资源。
  11.         System.out.println(“1:”+t.getClass().getResourceAsStream(“22.properties”));//输出java.io.BufferedInputStream@61de33
  12.         //文件名前加了“/”,则表示从类路径下也就是从classes文件夹下查找资源,如下表示从classes文件夹下查找22.properties文件资源。
  13.         System.out.println(“2:”+t.getClass().getResourceAsStream(“/22.properties”));//输出null
  14.         //文件名前加了“/”,则表示从类路径下也就是从classes文件夹下查找资源,如下表示从classes文件夹下查找11.properties文件资源。
  15.         System.out.println(“3:”+t.getClass().getResourceAsStream(“/11.properties”));//输出java.io.BufferedInputStream@14318bb
  16.         System.out.println();
  17.         //当前包路径4:file:/E:/myobject/myspider/build/classes/myspider/
  18.         System.out.println(“4:”+t.getClass().getResource(“”));
  19.         //输出当前类路径5:file:/E:/myobject/myspider/build/classes/
  20.         System.out.println(“5:”+t.getClass().getResource(“/”));
  21.         /*
  22.          * 如果类路径下的当前包有22.properties文件,则输出6:file:/E:/myobject/myspider/build/classes/myspider/22.properties
  23.          * 否者输出源文件下的22.properties文件的路径,则输出:6:file:/E:/myobject/myspider/src/myspider/22.properties
  24.          */
  25.         System.out.println(“6:”+t.getClass().getResource(“22.properties”));
  26.         /*
  27.          * 如果类路径下有11.properties文件,则输出7:file:/E:/myobject/myspider/build/classes/11.properties
  28.          * 否者输出源文件下的11.properties文件的路径,则输出:6:7:file:/E:/myobject/myspider/src/11.properties
  29.          */
  30.         System.out.println(“7:”+t.getClass().getResource(“/11.properties”));
  31.     }
  32. }

SystemConfig实现之从properties文件读取数据

根据从网上找的资料,使用properties类实现了读取配置文件信息。

import java.io.File;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

/**
*/
public class SystemConfig {

private SystemConfig(){

}

//获取环境变量init.conf.env
private static final String ENV=System.getProperty(“init.conf.env”);
//构建配置文件名
private static final String MQ_ARTICLE_PROPERTY_FILE = “mq-article-“+ENV+”.properties”;

private static Properties props = null;

/**
* 初始化ResourceBundle对象
* @throws IOException
*/
private static void init() throws IOException{
if( null == props){
props = new Properties();
loadFile();
}
}

/**
* 加载指定名称的properties文件,约定路径为/conf/
* @param propName
* @throws IOException
*/
private static void loadFile() throws IOException{
//获取配置文件列表/conf/*.properties
File dir = new File(SystemConfig.class.getResource(“/”).getPath()+”conf/”);
String[] fileNames = dir.list();

//过滤出符合当前环境的文件
//List<String> fileList = null;
if (fileNames != null && fileNames.length > 0) {
//fileList = Lists.newArrayList();
// 包括文件,文件夹的判断
for (String fName : fileNames) {
if (fName.indexOf(ENV) != -1) {
//fileList.add(fName);
//load进props
InputStream in = SystemConfig.class.getResourceAsStream(“/conf/” + fName);
props.load(in);
}
}
}
}

/**
* 获取系统配置
* @param key
* @param defaultValue
* @return
*/
public static String getProperties(String key,String defaultValue){
try {
init();
} catch (IOException e) {
props = null;
}
if(null == props)
return defaultValue;
return props.getProperty(key) == null ? defaultValue : props.getProperty(key);
}

}

除了使用properties类的方法外,Java还提供了resourcebundle的方式实现这一功能。

但是resourcebundle的命名规则有约束,主要为了实现国际化。这里还是先不用这个了。知道能实现即可。

数据聚合类网站数据来源

数据聚合类网站数据来源

1.有些是开放api(微博) 加层壳
2.有些是公开数据(例如股票数据) 自己转数据库/api

3.有些是服务商未授权的非即时服务(例如停车位 电影信息) 机器去爬数据 转数据库/api
4.有些是服务商未授权的非即时服务(例如违章车辆) 人肉找数据转数据库/api
5.有些是服务商未授权的即时服务(例如快递) 自己转web request成api

6.有些是服务商授权提供中介的即时服务/非即时服务 (例如图灵 360 小冰机器人)

apigee对大部分小用户免费
国内这几家都贵 性价比很低
haoservice.com/apilist/
apistore.baidu.com/
w
ww.juhe.com

国外:
https://apigee.com/providers

有必要的话搞爬虫,调用api,根据自己需求定。

 

vector和list之间的区别

正在阅读代码,发现有两个列表,一个使用的是list,一个使用的是vector,平时开发中都没真正去区分过这两个集合类之间的区别并在应用中使用,这里需要正视这个问题,并总结一下。

找到一篇博文,介绍了一下这两个类之间的区别,内容如下:

vector与list区别
vector为存储的对象分配一块连续的地址空间,因此对vector中的元素随机访问效率很高。在vecotor中插入或者删除某个元素,需要将现有元素进行复制,移动。如果vector中存储的对象很大,或者构造函数复杂,则在对现有元素进行拷贝时开销较大,因为拷贝对象要调用拷贝构造函数。对于简单的小对象,vector的效率优于list。vector在每次扩张容量的时候,将容量扩展2倍,这样对于小对象来说,效率是很高的。
list中的对象是离散存储的,随机访问某个元素需要遍历list。在list中插入元素,尤其是在首尾插入元素,效率很高,只需要改变元素的指针。
综上所述:
vector适用:对象数量变化少,简单对象,随机访问元素频繁
list适用:对象数量变化大,对象复杂,插入和删除频繁
最大的区别是,list是双向的,而vector是单向的。
因此在实际使用时,如何选择这三个容器中哪一个,应根据你的需要而定,一般应遵循下面
的原则:
1、如果你需要高效的随即存取,而不在乎插入和删除的效率,使用vector
2、如果你需要大量的插入和删除,而不关心随即存取,则应使用list
3、如果你需要随即存取,而且关心两端数据的插入和删除,则应使用deque。
vector   表示一段连续的内存区域,每个元素被顺序存储在这段内存中,对vector   的随机访问效率很高,但对非末尾元素的插入和删除则效率非常低。
deque
也表示一段连续的内存区域,但与vector不同的是它支持高效地在其首部插入和删除元素,它通过两级数组结构来实现,一级表示实际的容器,第二级指向容器的首和尾

list   表示非连续的内存区域并通过一对指向首尾元素的指针双向链接起来,插入删除效率高,随机访问效率低

2
stl提供了三个最基本的容器:vector,list,deque。
vector和built-in数组类似,它拥有一段连续的内存空间,并且起始地址不变,因此

它能非常好的支持随即存取,即[]操作符,但由于它的内存空间是连续的,所以在中间
进行插入和删除会造成内存块的拷贝,另外,当该数组后的内存空间不够时,需要重新
申请一块足够大的内存并进行内存的拷贝。这些都大大影响了vector的效率。

list就是数据结构中的双向链表(根据sgi   stl源代码),因此它的内存空间可以是不连续
的,通过指针来进行数据的访问,这个特点使得它的随即存取变的非常没有效率,因此它
没有提供[]操作符的重载。但由于链表的特点,它可以以很好的效率支持任意地方的删除
和插入。

deque是一个double-ended   queue,它的具体实现不太清楚,但知道它具有以下两个特点:
它支持[]操作符,也就是支持随即存取,并且和vector的效率相差无几,它支持在两端的
操作:push_back,push_front,pop_back,pop_front等,并且在两端操作上与list的效率
也差不多。

因此在实际使用时,如何选择这三个容器中哪一个,应根据你的需要而定,一般应遵循下面
的原则:
1、如果你需要高效的随即存取,而不在乎插入和删除的效率,使用vector
2、如果你需要大量的插入和删除,而不关心随即存取,则应使用list
3、如果你需要随即存取,而且关心两端数据的插入和删除,则应使用deque。

该博文地址《http://blog.163.com/lhl_soft/blog/static/20175000420120161422375/》

代码中的用法,大致是第一个是前端传递过来的文章对应的item列表,应该会有一些删除等操作,且数量应该较小,而后面那个是用来存储文章相关的产品列表,那么可能在查询出来之后不会进行变动操作,同时对应的产品的数量可能会比较大,所以如果在查询出来放到集合类中的时候效率比较高?尚未完全确认,这里对猜想做个记录。

PP日志part1

无他用,记录一下流水账,记录一下自己来pp之后做的事情。

4.14入职,当天上午签订合同,不过合同有一份写坏了,人事通知说啥时候邮件通知了啥时候再去联系人事将剩下的一份合同签了。好吧,也不着急。
领了电脑,G50,15寸,屏幕挺大挺爽,不过配置一般。第二天从家里带来了鼠标键盘等外设。带键盘主要是大屏笔记本自带的带数字键盘不习惯,点方向键的时候总是不小心点到数字键删除键和enter键上。还是用全键盘比较舒心。
当天下午参加了入职新员工培训,主要介绍东家的牛逼之处,以及内部的各种规章制度和薪资算法等。今天,才知道tm的每周的周二周四班车都是晚上八点才走,也就是说我每周四的训练基本就都泡汤了。考虑再三,由于膝盖正好伤了,也要修养,所以还是入职,等年底好跳槽的时候再走吧。在这镀镀金也是不错的。

I am hungry now…

 

vv,pv,uv,ip之间的区别

1.来访次数/访问次数(VV):VV = VisitView(访问次数):记录所有访客1天内访问了多少次你的网站,相同的访客有可能多次访问您的网站。从访客来到您网站到最终关闭网站的所有页面离开,计为1次访问。若访客连续30分钟没有新开和刷新页面,或者访客关闭了浏览器,则被计算为本次访问结束。

2.独立访客(UV):1天内相同访客多次访问网站,只计算为1个独立访客。

3.浏览次数(PV):即通常说的PV(PageView)值,用户每打开1个网站页面,记录1个PV。用户多次打开同一页面PV累计多次。用以衡量网站用户访问的网页数量。

4.ip:1天(00:00-24:00)之内,访问网站的不重复IP数。一天内相同IP地址多次访问网站只被计算1次。同一IP无论访问了几个页面,独立IP数均为1访问次数。