【Java基础】使用Properties

一.Java中的.properties文件

在编写Java程序的时经常需要读写.properties配置文件。如

# 上次最后打开的文件:
last_open_file=/data/hello.txt
# 自动保存文件的时间间隔:
auto_save_interval=60
  • .properties文件的特点是,它的Key-Value一般都是String-String类型的,因此可以用Map<String, String>来表示它。

  • Java集合库提供了一个Properties类来表示一组“配置”。由于历史遗留原因,Properties内部本质上是一个Hashtable但我们只需要用到Properties自身关于读写配置的接口。

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

二.读取配置文件

1.从文件流加载properties

有以下配置文件

last_open_file=/data/hello.txt
auto_save_interval=60
用Properties读取配置文件,一共有三步:
1. 创建Properties实例;
2. 调用load(),传入文件流读取文件;
3. 调用getProperty()根据key民名字获取配置。
	String file = "setting.properties";
	Properties props = new Properties();
	props.load(new FileInputStream(file ));
	
	String filepath = props.getProperty("last_open_file");
	String interval = props.getProperty("auto_save_interval", "120");

调用getProperty()获取配置时,如果key不存在,将返回null。可以设置默认值,当key不存在时,就返回默认值。

2.从classPath加载配置文件

  • classpath读取.properties文件,因为load(InputStream)方法接收一个InputStream实例,表示一个字节流,它不一定是文件流,也可以是从jar包中读取的资源流:
    Properties props = new Properties();
    props.load(getClass().getResourceAsStream("/common/setting.properties"));
    

3.从内存读取一个字节流加载配置文件

	import java.io.*;
	import java.util.Properties;

	public class Main {
    	public static void main(String[] args) throws IOException {
        	String settings = "# test" + "\n" + "course=Java" + "\n" + "last_open_date=2019-08-07T12:35:01";
        	ByteArrayInputStream input = new ByteArrayInputStream(settings.getBytes("UTF-8"));
        	Properties props = new Properties();
        	props.load(input);
	
        	System.out.println("course: " + props.getProperty("course"));
        	System.out.println("last_open_date: " + props.getProperty("last_open_date"));
        	System.out.println("last_open_file: " + props.getProperty("last_open_file"));
        	System.out.println("auto_save: " + props.getProperty("auto_save", "60"));
    	}
	}

执行结果
在这里插入图片描述

4.注意事项

  1. Properties设计的目的是存储String类型的key-value键值对,但Properties实际上是从Hashtable派生的,它的设计实际上是有问题的,但是为了保持兼容性,现在已经没法修改了。
  2. 除了getProperty()setProperty()方法外,还有从Hashtable继承下来的get()和put()方法,这些方法的参数签名是Object,我们在使用Properties的时候,不要去调用这些从Hashtable继承下来的方法。

三.写入配置文件

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

写入配置文件使用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 reader,String charset)读取:

    Properties props = new Properties();
    props.load(new FileReader("settings.properties", StandardCharsets.UTF_8));
    

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

五.总结

  1. Java集合库提供的Properties用于读写配置文件.properties。.properties文件可以使用UTF-8编码。

  2. 可以从文件系统classpath其他任何地方读取.properties文件。

  3. 读写Properties时,注意仅使用getProperty()和setProperty()方法,不要调用继承而来的get()和put()等方法。

Java的Properties使用及格式定义
Java Properties类使用基础
Java中getResourceAsStream的用法
getResource和getResourceAsStream
getResourceAsStream的几种路径配置

猜你喜欢

转载自blog.csdn.net/qq877728715/article/details/104132991