由于历史遗留原因,Properties内部本质上是一个Hashtable,但我们只需要用到Properties自身关于读写配置的接口。
读取配置文件
Java默认配置文件以.properties为扩展名,每行以key=value表示,以#开头的是注释
用Properties读取配置文件
- 创建
Properties实例 - 调用
load()读取文件 - 调用
getProperty()获取取配置,如果key不存在,返回null
还可以从classpath读取.properties文件Properties properties = new Properties();properties.load(getClass().getResourceAsStream("/someConfig.preperties")
String f = "/setting.properties";Properties props = new Properties();props.load(new FileInputStream(f));String filepath = props.getProperties("last_open_file");String interval = props.getProperties("save_file_interval","99");
也可以从classpath 读取.properties文件,因为load(InputStream)方法接收一个InputStream实例,表示一个字节流,它不一定是文件流, 也可以是从jar包中读取的资源流
Properties p = new Properties();p.load(SomeClass.class.getResoureceAsStream("/common/setting.properties");
试试从内存读取一个字节流
public class Main{public static void main(String[] args){String settings = "# test" + "\n" + "course = Java" + "\n last_open_date=20200220T02:20:02";ByteArrayInputStream input = new ByteArrayInputStream(settings.getBytes("UTF-8"));//StandardCharsets.UTF-8Properties pros = new Properties();pros.load(input);System.out.println(Pros.getProperties("course"));}}
new FIle(“.”).getAbsoluteFile();
如果有多个.properties文件,可以反复调用 load()读取,后读取的key-value会覆盖已读取的key-value.**properties**的一个常用用法:可以把默认配置文件放到classpath中,然后,根据机器的环境编写另一个配置文件,覆盖某些默认的配置。
写入配置文件
如果通过setProperty()修改了Properties实例,可以把配置写入文件,以便下次启动时获得最新配置。写入配置文件使用store()方法
Properties p = new Properties();p.setProperty("url","http://liaoxuefeng.com");p.setProperty("language","Java");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)读取
Propertres p = new Propertires();p.load(new FildReader("settings.properties", StandardCharsets.UTF_8));
InputStream和Reader的区别是:一个是字节流,一个是字符流。字符流在内存中已经以char类型表示了,不涉及编码问题。
小结
Java集合库提供的Propertes用于读写配置文件.properties。
可以从文件系统、classpath或其他任何地方读取.properties文件
读写Properties时, 注意仅使用getProperty()和setProperty()方法,不要调用继承来的get()和put()等方法
