由于历史遗留原因,Properties内部本质上是一个Hashtable,但我们只需要用到Properties自身关于读写配置的接口。

读取配置文件

Java默认配置文件以.properties为扩展名,每行以key=value表示,以#开头的是注释
Properties读取配置文件

  1. 创建Properties实例
  2. 调用load()读取文件
  3. 调用 getProperty() 获取取配置,如果key不存在,返回null

还可以从classpath读取.properties文件
Properties properties = new Properties();
properties.load(getClass().getResourceAsStream("/someConfig.preperties")

  1. String f = "/setting.properties";
  2. Properties props = new Properties();
  3. props.load(new FileInputStream(f));
  4. String filepath = props.getProperties("last_open_file");
  5. String interval = props.getProperties("save_file_interval","99");

也可以从classpath 读取.properties文件,因为load(InputStream)方法接收一个InputStream实例,表示一个字节流,它不一定是文件流, 也可以是从jar包中读取的资源流

  1. Properties p = new Properties();
  2. p.load(SomeClass.class.getResoureceAsStream("/common/setting.properties");

试试从内存读取一个字节流

  1. public class Main{
  2. public static void main(String[] args){
  3. String settings = "# test" + "\n" + "course = Java" + "\n last_open_date=20200220T02:20:02";
  4. ByteArrayInputStream input = new ByteArrayInputStream(settings.getBytes("UTF-8"));//StandardCharsets.UTF-8
  5. Properties pros = new Properties();
  6. pros.load(input);
  7. System.out.println(Pros.getProperties("course"));
  8. }
  9. }

new FIle(“.”).getAbsoluteFile();

如果有多个.properties文件,可以反复调用 load()读取,后读取的key-value会覆盖已读取的key-value.
**properties**的一个常用用法:可以把默认配置文件放到classpath中,然后,根据机器的环境编写另一个配置文件,覆盖某些默认的配置。

写入配置文件

如果通过setProperty()修改了Properties实例,可以把配置写入文件,以便下次启动时获得最新配置。写入配置文件使用store()方法

  1. Properties p = new Properties();
  2. p.setProperty("url","http://liaoxuefeng.com");
  3. p.setProperty("language","Java");
  4. p.store(new FileOutputStream("./setting.properties"), "这是properties注释");

编码

早期版本Java规定.properties文件编码是ASCII编码(ISO8859-1),如果涉及到中文,就必须用name = _\u6CE8\u91CA_来表示。
从JDK9开始,Java的.properties文件夹可以使用UTF-8编码了。
不过需要注意的是,由于load(InputStream)默认总是以ASCII编码读取字节流,所以会导致读到乱码,我们需要另一个重载方法load(Reader)读取

  1. Propertres p = new Propertires();
  2. p.load(new FildReader("settings.properties", StandardCharsets.UTF_8));

InputStreamReader的区别是:一个是字节流,一个是字符流。字符流在内存中已经以char类型表示了,不涉及编码问题。

小结

Java集合库提供的Propertes用于读写配置文件.properties
可以从文件系统、classpath或其他任何地方读取.properties文件
读写Properties时, 注意仅使用getProperty()setProperty()方法,不要调用继承来的get()put()等方法