配置文件的一种,内容以键值对的形式存在,且每个键值对独占一行。#号作为行注释的起始标志,中文注释会自动进行unicode编码。示例:
#ipandportofserversocketip=127.0.0.1port=9999#errormessagemsg=I'msorry,byebye!假设上述内容存储在config.properties文件下,且bin目录结果如下:
bin
|--main
|--Demo.class
|--config.properties
后续章节的示例将以上述内容作为目标对象来操作。
三、通过Properties对象操作
读取属性,示例:
publicclassDemo{publicstaticvoidmain(String[]args){Propertiesprops=newProperties();InputStreamin=Demo.class.getResourceAsStream("../config.properties");//或使用文件输入流(不推荐),假设当前工作目录为bin//InputStreamin=newFileInputStream("./config.properties");props.load(in);in.close();//读取特定属性Stringkey="ip";Stringip=props.getProperty(key);//遍历所有属性,方式一Setkeys=props.keySet();for(Interatorit=keys.iterator();it.hasNext();){Stringk=it.next();System.out.println(k+":"+props.getProperty(k));}//遍历所有属性,方式二Enumerationen=props.propertyNames();while(en.hasMoreElements()){Stringk=en.nextElement();System.out.println(k+":"+props.getProperty(k));}}}1.通过Demo.class.getResourceAsStream("../config.properties");读取配置文件,配置文件的相对路径以类文件所在目录作为当前目录。
2.通过newFileInputStream("./config.properties");读取配置文件,配置文件的相对路径以工作目录(可以通过System.getProperty("user.dir")获取工作目录)作为当前目录。
注意:上述两种方式获取的配置文件均没有被缓存。每次都要重新加载配置文件。
写属性,示例:
Propertiesprops=newProperties();InputStreamin=getClass().getResouceAsStream("properties文件相对于当前类加载路径的文件目录");props.load(in);OutputStreamoutput=newFileOutputStream("properties文件路径");props.setProperty("ip","10.248.112.123");//修改或新增属性键值对props.store(output,"modifyipvalue");//store(OutputStreamoutput,Stringcomment)将修改结果写入输出流output.close()
四、通过ResourceBundle对象操作
通过该方式仅能读取配置文件而已,不能进行写操作。示例:
//ResourceBundlerb=ResourceBundle.getBundle("配置文件相对工程根目录的相对路径(不含扩展名)");ResourceBundlerb=ResourceBundle.getBundle("config");try{Stringname=rb.getString("name");}catch(MissingResourceExceptionex){注意:上述方式会缓存配置文件信息,后续读取时均是读取缓存中的内容,若在此期间修改了配置内容是无法实时同步的
ResourceBundle有两个子类ListResourceBundle和PropertyResourceBundle,在读取properties文件时实际上是使用PropertyResourceBundle来处理。
题外话:
ResourceBundle主要用于解决国际化和本地化问题。通过资源命名定义各语言和方言的信息,然乎程序在运行时获取当前本地化信息,并根据本地化信息加载相应的资源完成本地化。
资源命名规范:
//仅含家族名MyResource//含家族名和语言MyResource_en//含家族名、语言和国家MyResource_en_US对应的Java代码:
//ResourceBundle首先会根据语言和国家的本地化信息去查找资源(假设现在要查找MyResource_zh_CN),当找不到时就会找MyResource_zh,再找不到就用MyResource。ResourceBundlerb=ResourceBundle.getBundle("MyResource",Locale.getDefault())