Java源码类 - Properties类
一、Properties概述
Properties是JDK1.0中引入的java类,在项目中大量使用。表示一个持久的属性集,可以保证在流中或从流中加载,属性列表中每个键及其值都是一个字符串。
主要作用:通过修改配置文件可以方便的修改代码中的参数,实现不用改class文件即可灵活变更参数。
二、Properties类图
java.util.Properties继承自java.util.Hashtable,是一个持久化的属性保存对象,可以将属性内容写出到可以将属性内容写出到stream中或者从stream中读取属性内容。
三、Properties重要特性
- 在底层的Hashtable中,每一对属性的key和value都是按照string类型来保存的;
- Properties支持文本方式和xml方式的数据存储。在文本方式中,格式为key:value,其中分隔符可以是:冒号(😃、等号(=)、空格。其中空格可以作为key的结束,同时获取的值回将分割符号两端的空格去掉;
- Properties可以将其他的Properties对象作为默认的值;
- Hashtable的所有方法Properties对象均可以访问,但是不建议这么做,因为Hashtable可以存放其他数据类型,这样会导致Properties一些方法调用报错;
- 在properties文件中,可以用井号"#"来作注释;
- 线程安全;
- key、value不可以是Null;
四、Properties主要的方法
方法名 | 方法说明 | 备注 |
setProperty(String key,String value) | 向Properties对象中添加参数和值 | - |
getProperty(String key) | 获取指定参数值 | |
load(InputStream in) | 以字节输入流加载配置文件到对象中 | |
load(Reader in) | 以字符输入流加载配置文件到对象中 | |
store(OutputStream out,String comments) | 以字节输出流将对象中的内容输出到配置文件中 | |
store(Writer out, String comments) | 以字符输出流将对象中的内容输出到配置文件中 |
五、Properties六种读取方法
5.1 使用java.util.Properties类的load()方法
public void runProperties(){ try { String path_properties= this.getClass().getClassLoader().getResource("customer.properties").getPath(); InputStream inputStream = new BufferedInputStream(new FileInputStream(path_properties)); Properties p = new Properties(); p.load(inputStream); System.out.println(p.getProperty("goyeer.name")); } catch (Exception e) { System.out.println(e.getMessage()); }
5.2 使用java.util.ResourceBundle类的getBundle()方法
public void runResourceBundle(){ try { Locale locale = new Locale("zh", "CN"); ResourceBundle resource = ResourceBundle.getBundle("customer",locale); String gy_name = resource.getString("goyeer.name"); System.out.println(gy_name); }catch (Exception ex){ System.out.println(ex.getMessage()); } }
5.3 使用java.util.PropertyResourceBundle类的构造函数
public void runPropertyResourceBundle(){ try { String path_properties= this.getClass().getClassLoader().getResource("customer.properties").getPath(); InputStream inStream = new BufferedInputStream(new FileInputStream(path_properties)); ResourceBundle rb = new PropertyResourceBundle(inStream); String gy_name = rb.getString("goyeer.name"); System.out.println(gy_name); }catch (Exception exception){ System.out.println(exception.getMessage()); } }
5.4 使用class变量的getResourceAsStream()方法
public void runJProperties(){ try { InputStream in = this.getClass().getResourceAsStream("/customer.properties"); Properties p = new Properties(); p.load(in); String gy_name = p.getProperty("goyeer.name"); System.out.println(gy_name); }catch (Exception exception){ System.out.println(exception.getMessage()); } }
5.5 使用class.getClassLoader()所得到的java.lang.ClassLoader的getResourceAsStream()方法
public void runClassLoaderAndStream(){ try { InputStream in = this.getClass().getClassLoader().getResourceAsStream("customer.properties"); Properties p = new Properties(); p.load(in); String gy_name = p.getProperty("goyeer.name"); System.out.println(gy_name); }catch (Exception exception){ System.out.println(exception.getMessage()); } }
5.6 使用java.lang.ClassLoader类的getSystemResourceAsStream()静态方法
public void runClassLoaderAndSystemResourceAsStream() { try { InputStream in = ClassLoader.getSystemResourceAsStream("customer.properties"); Properties p = new Properties(); p.load(in); String gy_name = p.getProperty("goyeer.name"); System.out.println(gy_name); } catch (Exception exception) { System.out.println(exception.getMessage()); } }
5.6 在Servlet中可以使用javax.servlet.ServletContext的getResourceAsStream()方法
public void runServletContext(ServletContext context){ try { String path= this.getClass().getClassLoader().getResource("customer.properties").getPath(); InputStream in = context.getResourceAsStream(path); Properties p = new Properties(); p.load(in); String gy_name = p.getProperty("goyeer.name"); System.out.println(gy_name); }catch (Exception exception){ System.out.println(exception.getMessage()); } }
对应properties文件操作的方法比较多,根据不同的场景选择适合的方法。