Java集合库提供了一个Properties来表示一组“配置”。由于历史遗留原因,Properties内部本质上是一个Hashtable,但我们只需要用到Properties自身关于读写配置的接口。
    Properties读取配置文件非常简单。Java默认配置文件以.properties为扩展名,每行以key=value表示,以#课开头的是注释。以下是一个典型的配置文件:

    1. # setting.properties
    2. last_open_file=/data/hello.txt
    3. auto_save_interval=60

    可以从文件系统读取这个.properties文件:

    1. String f = "setting.properties";
    2. Properties props = new Properties();
    3. props.load(new java.io.FileInputStream(f));
    4. String filepath = props.getProperty("last_open_file");
    5. String interval = props.getProperty("auto_save_interval", "120");

    可见,用Properties读取配置文件,一共有三步:

    1. 创建Properties实例;
    2. 调用load()读取文件;
    3. 调用getProperty()获取配置。

    因为load(InputStream)方法接收一个InputStream实例,表示一个字节流,它不一定是文件流,也可以是从jar包中读取的资源流
    Properties设计的目的是存储String类型的key-value,但Properties实际上是从Hashtable派生的,它的设计实际上是有问题的,但是为了保持兼容性,现在已经没法修改了。除了getProperty()setProperty()方法外,还有从Hashtable继承下来的get()put()方法,这些方法的参数签名是Object,我们在使用Properties的时候,不要去调用这些从Hashtable继承下来的方法。
    由于load(InputStream)默认总是以ASCII编码读取字节流,所以会导致读到乱码。我们需要用另一个重载方法load(Reader)读取:

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

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