Properties
Properties属性文件在JAVA应用程序中是经常可以看得见的,也是特别重要的一类文件。它用来配置应用程序的一些信息,不过这些信息一般都是比较少的数据,没有必要使用数据库文件来保存,而使用一般的文本文件来保存,如果是通过File直接保存的话,可能在存储和读取上都不是很方便,但如果保存为Properties文件就不一样了,属性文件都有键值对应的,在JAVA的包中,有提供专门的操作属性文件的类。这个类就是 java.uitl.Properties类,由于Properties类是一个集合类,所以,Properties会将属性以集合的方式读写。
Properties类继承字Hashtable类,采用键值对应的存储方式.
读写方法
public void load(InputStream isStream) throws IOExpection {}
public void store(OutputStream out, String comments) throws IOExpection {}
创建一个course.properties文件
ftp.server.ip=10.160.105.135
ftp.user=ftpuser
ftp.pass=123456
ftp.server.http.prefix=http://image.huihui.com/
alipay.callback.url=http://www.huihui.com/order/alipay_callback.do
password.salt = geelysdafaqj23ou89ZXcj@#$@#$#@KJdjklj;D../dSF.,
读取文件
Properties prop = new Properties();//属性集合对象
FileInputStream fis = new FileInputStream("course.properties");//属性文件流
prop.load(fis);//将属性文件流装载到Properties对象中
上面代码是读取文件最基本的方式,但是如果我们在ssm框架中使用该怎么写呢?
props.load(new InputStreamReader(PropertiesUtil.class.getClassLoader().getResourceAsStream("course.properties"),"UTF-8"));
Tools.class.getClassLoader().getResourceAsStream(file);
首先,调用对象的getClass()方法是获得对象当前的类类型,这部分数据存在方法区中,而后在类类型上调用getClassLoader()方法是得到当前类型的类加载器,在Java中所有的类都是通过加载器加载到虚拟机中的,而且类加载器之间存在父子关系,就是子知道父,父不知道子,这样不同的子加载的类型之间是无法访问的(虽然它们都被放在方法区中),所以在这里通过当前类的加载器来加载资源也就是保证是和类类型同一个加载器加载的。
最后调用了类加载器的getResourceAsStream()方法来加载文件资源
ClassLoader.getResourceAsStream() 与 Class.getResourceAsStream()的区别
Class.getResourceAsStream() 会指定要加载的资源路径与当前类所在包的路径一致。
例如你写了一个MyTest类在包com.test.mycode 下,那么MyTest.class.getResourceAsStream(“name”) 会在com.test.mycode包下查找相应的资源。
读取键值方法
- Properties类提供了getProperty(String key)方法用来通过键名读取键值,
- 当key在属性集合中找不到时又想为key在程序中赋予一个值时可以使用public String getProperty(String key, String defaultValue)方法,这个方法的意思就是用指定的键在属性列表中搜索属性。如果在属性列表中未找到该键,则接着递归检查默认属性列表及其默认值。如果未找到属性,则此方法返回默认值变量:
设置(写)属性
setProperty(String key, String value),这个方法就是当属性集合中存在指定的key时,就修改这个key的值,如果不存在,就新建一个key,同样是通过键值关系保存的,但值得注意的是,Properties类继承自Hashtable,所以也可以用Hashtable的put和putAll方法保存,但强烈反对使用这两个方法,因为它们允许调用方插入其键或值不是 Strings 的项。相反,应该使用 setProperty 方法。
//修改sitename的属性值
prop.setProperty("sitename", "Boxcode");
//添加一个新的属性studio
prop.setProperty("studio", "Boxcode Studio");
//文件输出流
FileOutputStream fos = new FileOutputStream("prop.properties");
//将Properties集合保存到流中
prop.store(fos, "Copyright (c) Boxcode Studio");
fos.close();//关闭流
我们一般使用的多为读取属性,写了解便可。
读接口示例
public class PropertiesUtil {
private static Logger logger = LoggerFactory.getLogger(PropertiesUtil.class);
private static Properties props;
static {
String fileName = "course.properties";
props = new Properties();
try {
props.load(new InputStreamReader(PropertiesUtil.class.getClassLoader()
.getResourceAsStream(fileName),"UTF-8"));
} catch (IOException e) {
logger.error("配置文件读取异常",e);
}
}
public static String getProperty(String key){
String value = props.getProperty(key.trim());
if(StringUtils.isBlank(value)){
return null;
}
return value.trim();
}
public static String getProperty(String key,String defaultValue){
String value = props.getProperty(key.trim());
if(StringUtils.isBlank(value)){
value = defaultValue;
}
return value.trim();
}
}