Java应用程序中如何使用Properties类读写配置文件教程
使用Properties

编写应用程序时,常常需要对配置文件进行读写操作。比如,有关于用户的设置:
# 上次最后打开的文件:[id_1900468860]=/data/hello.txt# 自动保存文件的时间间隔:auto_save_interval=60
配置文件的特点在于,其 Key-Value 通常为 String-String 类型。正因如此,我们完全具备用 Map 来对其进行表示的条件。
配置文件很常用,所以 Java 集合库提供了一个 Properties 来表示一组“配置”。由于历史遗留的缘故,Properties 内部实际上是一个 Hashtable,不过我们只需用到 Properties 自身用于读写配置的接口。
读取配置文件
使用 Properties 来读取配置文件是很简单的。在 Java 中,默认的配置文件其扩展名是.properties 。该配置文件每行的形式是 key=value ,而以#开头的行则是注释。以下是一个具有代表性的配置文件:
# setting.propertieslast_open_file=/data/hello.txtauto_save_interval=60
可以从文件系统读取这个.properties文件:
String f = "setting.properties";Properties props = new Properties();props.load(new java.io.FileInputStream(f));String filepath = props.getProperty("last_open_file");String interval = props.getProperty("auto_save_interval", "120");
可见,用Properties读取配置文件,一共有三步:
可以从 classpath 读取.properties 文件,因为 load(InputStream) 方法能够接收一个 InputStream 实例,此实例表示一个字节流,而这个字节流不一定是文件流,也有可能是从 jar 包中读取的资源流。
Properties props = new Properties();props.load(getClass().getResourceAsStream("/common/setting.properties"));
试试从内存读取一个字节流:
如果存在多个.properties 文件,能够多次调用 load() 进行读取。并且,后面读取的 key-value 会将之前已读取的 key-value 覆盖掉。
Properties props = new Properties();props.load(getClass().getResourceAsString("/common/setting.properties"));props.load(new FileInputStream(“C 盘下的 conf 文件夹中的 setting.properties 文件”));
上面的代码展示了 Properties 的一种常用方式:能够将默认配置文件放置于 classpath 内。接着,依据机器的环境来编写另一个配置文件,以此来覆盖部分默认的配置。
Properties 的设计初衷是用来存储 String 类型的 key - value。然而实际上,Properties 是从 Hashtable 派生出来的。它的设计存在一定问题,只是为了保持兼容性,到现在已经无法进行修改了。除了有 getProperty() 和 setProperty() 方法之外,还有从 Hashtable 继承而来的 get() 和 put() 方法。这些方法的参数签名是 Object。我们在使用 Properties 时,不要调用这些从 Hashtable 继承而来的方法。
写入配置文件
如果 Properties 实例通过 setProperty()被修改了,那么就可以将配置写入文件,这样在下次启动时就能获得最新配置。写入配置文件需使用 store()方法。
Properties props = new Properties();props.setProperty("url", "http://www.liaoxuefeng.com");props.setProperty("language", "Java");props.store(new FileOutputStream("C:\\conf\\setting.properties"), "这是写入的properties注释");
编码
早期版本的 Java 规定.properties 文件的编码为 ASCII 编码(ISO8859-1)。若涉及中文,就必须用 name=\u4e2d\u6587 来进行表示,这样的方式极为别扭。自 JDK9 起,Java 的.properties 文件能够使用 UTF-8 编码了。
需要注意的是,load(InputStream)默认是以 ASCII 编码来读取字节流的,这样就会引发读到乱码的情况。我们应当使用另一个重载方法 load(Reader)来进行读取。
Properties props = new Properties();props.load(new FileReader("settings.properties", StandardCharsets.UTF_8));
可以正常读取中文。InputStream 与 Reader 的区别在于,InputStream 是字节流,而 Reader 是字符流。字符流在内存中是以 char 类型来表示的,并且不涉及编码问题。
小结
Java 集合库提供的 Properties 可用于读写配置文件。这种配置文件是.properties 文件。.properties 文件能够使用 UTF-8 编码。
能够从文件系统中读取.properties 文件,也能够从 classpath 中读取.properties 文件,还能够从其他任何地方读取.properties 文件。
读写 Properties 时,要注意只能使用 getProperty()方法和 setProperty()方法,不可以调用继承而来的 get()方法以及 put()等方法。
读后有收获可以支付宝请作者喝咖啡,读后有疑问请加微信群讨论