Java 集合:Properties 类

Java 的Properties类(全限定名:java.util.Properties)本质上类似一个专门存储String 类型键值对的映射结构(它间接继承自Map)。该类的核心能力在于:既能将键值对写入磁盘上的.properties文件,也能从已有的.properties文件中读取键值对并加载。正因如此,Properties成为 Java 应用中存储简单配置属性(如数据库连接参数、应用基础设置等)的常用机制。

Java 集合:Properties 类

  

创建 Properties 实例

要使用 Java 的Properties类,首先需要创建该类的实例,这可以通过调用其构造函数并配合 Java 的 new关键字来完成。例如:

Properties properties = new Properties();

  

设置属性

要在 Java 的 Properties 实例中设置属性,需使用 setProperty() 方法。例如:

Properties properties = new Properties();
properties.setProperty("email", "helen@gmail.com");

上面示例将键为 email 的属性设置为值 helen@gmail.com。

  

获取属性

要从 Java 的 Properties 对象中获取属性值,需调用 getProperty () 方法,并将目标属性的键作为参数传入该方法。例如:

Properties properties = new Properties();
properties.setProperty("email", "helen@gmail.com");

// 获取 email 的值
String email = properties.getProperty("email");
System.out.println(email); //helen@gmail.com

  

移除属性

你也可以使用 Properties 实例的 remove() 方法来移除其中的属性,只需将待移除属性的键作为参数传递给 remove() 方法即可。例如:

Properties properties = new Properties();
properties.setProperty("email", "helen@gmail.com");

// 移除 email 属性
Object removeResult = properties.remove("email");
System.out.println(removeResult); //helen@gmail.com

  

迭代属性

你可以通过 keySet() 获取 Properties 实例的键集,然后迭代该键集的方式,来遍历 Properties 实例中的所有键。例如:

Properties properties = new Properties();
properties.setProperty("email", "helen@gmail.com");
properties.setProperty("name", "helen");
properties.setProperty("id", "1000");

Iterator<Object> iterator = properties.keySet().iterator();
while (iterator.hasNext()) {
    String key = (String) iterator.next();
    System.out.println(key + "=" + properties.getProperty(key));
}

此示例将打印出以下行:

name=helen
id=1000
email=helen@gmail.com

  

将属性存储到文件中

你可以将属性键值对存储到属性文件中,之后还能再次读取该文件。这一存储操作可通过 Properties 对象的 store () 方法来实现,该方法能将对象中的内容写入到指定的属性文件中。例如:

Properties properties = new Properties();
properties.setProperty("email", "helen@gmail.com");
properties.setProperty("name", "helen");
properties.setProperty("id", "1000");

try(FileWriter output = new FileWriter("D:/me.properties")){
    properties.store(output, "These are properties");
} catch (IOException e) {
    e.printStackTrace();
}

默认情况下,Java 属性文件的编码格式为 ISO-8859-1(即 Latin-1),但该编码仅支持有限字符集,无法很好地兼容中文等非拉丁字符。如今实际开发中,更常用 UTF-8 编码 来处理多语言场景。

若需指定文件编码存储属性,可在使用 FileWriter 时,通过其支持编码参数的构造方法(第二个参数传入编码名称)来明确设置,例如指定为 UTF-8 编码。例如:

Properties properties = new Properties();
properties.setProperty("email", "helen@gmail.com");
properties.setProperty("name", "helen");
properties.setProperty("id", "1000");

try(FileWriter output = new FileWriter("D:/me.properties", StandardCharsets.UTF_8)){
    properties.store(output, "These are properties");
} catch (IOException e) {
    e.printStackTrace();
}

属性文件格式

一个 Java Properties 属性文件由多行组成,每行包含一个 key=value 键值对。以下是一个 Java Properties 属性文件的示例:

#These are properties
#Tue Sep 30 16:21:51 CST 2025
name=helen
id=1000
email=helen@gmail.com

注意,以 # 开头的行是注释。属性文件的第一行实际上是调用 properties.store(文件, 说明信息) 方法的第二个参数。

  

从文件加载属性

可以通过 Properties 对象的 load() 方法,将存储在属性文件中的属性加载回该对象。例如:

Properties properties = new Properties();
try(FileReader reader = new FileReader("D:/me.properties")){
    properties.load(reader);
    System.out.println(properties);
    //{name=helen, id=1000, email=helen@gmail.com}
} catch (IOException e) {
    e.printStackTrace();
}

默认情况下,load() 方法会假定所加载的文件采用 ISO-8859-1(Latin-1)编码。如果你的属性文件使用其他编码,例如 UTF-8,则必须在用于加载属性文件的 FileReader 中将该编码指定为第二个参数。例如:

Properties properties = new Properties();
try(FileReader reader = new FileReader("D:/me.properties", StandardCharsets.UTF_8)){
    properties.load(reader);
    System.out.println(properties);
    //{name=helen, id=1000, email=helen@gmail.com}
} catch (IOException e) {
    e.printStackTrace();
}

  

将属性存储到XML文件

Properties 类还可以通过其 storeToXML() 方法,将存储在其中的键值对写入 XML 文件。例如:

Properties properties = new Properties();
properties.setProperty("email", "helen@gmail.com");
properties.setProperty("name", "helen");
properties.setProperty("id", "1000");

try(FileOutputStream output = new FileOutputStream("D:/me.xml")){
    properties.storeToXML(output, "Descriptive information");
} catch (IOException e) {
    e.printStackTrace();
}

运行结果:

Java 集合:Properties 类

默认情况下,Properties XML属性文件的编码是UTF-8。这与非XML属性文件的默认编码相反。如果需要为 XML 文件使用其他编码,也是可以的。你可以将所要使用的文件编码指定为 storeToXML 方法的第三个参数。以下是使用 ISO-8859-1 编码将 Properties 存储到XML的示例,例如:

Properties properties = new Properties();
properties.setProperty("email", "helen@gmail.com");
properties.setProperty("name", "helen");
properties.setProperty("id", "1000");

try(FileOutputStream output = new FileOutputStream("D:/me.xml")){
    properties.storeToXML(output, "Descriptive information", StandardCharsets.ISO_8859_1);
} catch (IOException e) {
    e.printStackTrace();
}

运行结果:

Java 集合:Properties 类

  

从XML文件加载属性

你可以通过 Properties 对象的 loadFromXML() 方法,从 XML 属性文件中加载属性。例如:

Properties properties = new Properties();
try(FileInputStream fileInputStream = new FileInputStream("D:/me.xml")){
    properties.loadFromXML(fileInputStream);
    System.out.println(properties); //{name=helen, id=1000, email=helen@gmail.com}
} catch(IOException e){
    e.printStackTrace();
}

默认情况下,loadFromXML() 方法会假定 XML 文件采用 UTF-8 编码存储。请注意,这与非 XML 属性文件的默认编码情况相反。如果你的 XML 文件使用其他编码,例如 ISO-8859-1(Latin-1),那么你的XML文件必须在内部指定该编码。具体做法是,在XML属性文件的第一行包含以下内容:

<?xml version="1.0" encoding="ISO-8859-1"?>

  

从类路径加载属性

可以将属性从类路径上的可用文件加载到 Properties 对象中。这里所说的 "类路径上的文件",既可以是与加载属性的应用程序位于同一个 JAR 文件中,也可以是在 Java 应用程序运行时,处于 Java 类路径上的其他 JAR 文件或目录中。

若要从类路径上的文件加载属性,首先需要获取一个 Class 实例。在下面的示例中,我将从包含应用程序 main () 方法的类中获取该实例:

Class aClass = PropertiesExample.class;

一旦我获得了 Class 实例,就可以调用它的 getResourceAsStream() 方法,该方法会返回一个引用该文件的 Java 输入流(Java InputStream)。例如:

Class<?> clazz = PropertiesDemo.class;
InputStream inputStream = clazz.getResourceAsStream("/database.properties");

database.properties 文件必须位于类路径的根目录下。如下图:

Java 集合:Properties 类

Java 集合:Properties 类

如果将其放入子目录中,传递给 getResourceAsStream() 的路径应反映这一点,例如:/subdir/database.properties。

借助 InputStream,你可以使用 Properties 的 load() 或 loadFromXML() 方法,将文件加载到  Properties 实例中。例如:

Class<?> clazz = PropertiesDemo.class;
Properties properties = new Properties();

try (InputStream inputStream = clazz.getResourceAsStream("/database.properties")) {
    properties.load(inputStream);

    Iterator<Object> iterator = properties.keySet().iterator();
    while(iterator.hasNext()) {
        String key = (String) iterator.next();
        System.out.println(key + "=" + properties.getProperty(key));
    }
} catch (Exception e) {
    e.printStackTrace();
}

运行结果:

db.pool.initialSize=5
db.password=123456
db.pool.validationQuery=SELECT 1
db.pool.maxIdle=10
db.pool.maxActive=20
db.pool.minEvictableIdleTimeMillis=300000
db.username=root
db.url=jdbc:oracle:thin:@localhost:1521:orcl
db.pool.minIdle=3
db.pool.maxWait=3000
db.pool.timeBetweenEvictionRunsMillis=60000

Process finished with exit code 0

  

默认属性

Java 的 Properties 类支持为特定场景提供默认属性值 —— 即当 Properties 实例中未注册(不存在)某个目标属性键时,可返回预先设定的默认值。实现这一功能主要有以下两种方式:

  • 为 getProperty() 方法提供一个默认值。

  • 在创建新的 Properties 实例时,提供一个包含默认值的 Properties 实例。

使用 getProperty() 方法设置默认值

getProperty() 方法有一个重载版本,它会接收一个额外参数 —— 当 Properties 实例中不包含给定键对应的值时,该参数将作为默认值返回。例如:

Properties properties = new Properties();
properties.setProperty("email", "helen@gmail.com");
properties.setProperty("name", "helen");
properties.setProperty("id", "1000");

String age = properties.getProperty("age", "20");
System.out.println(age); //20

注意,如果 Properties 实例不包含键为 age 的属性,那么将返回值 20,而不是返回 null —— 如果没有向getProperty() 传递默认值,就会返回 null。

带有默认属性实例的默认值

Properties 类可以用另一个 Properties 实例来实例化,这个实例包含了默认值,当新创建的 Properties 实例不包含所请求的属性键的值时,就会使用这些默认值。例如:

Properties defaultProperties = new Properties();
defaultProperties.setProperty("age", "20");

Properties properties = new Properties(defaultProperties);
properties.setProperty("email", "helen@gmail.com");
properties.setProperty("name", "helen");
properties.setProperty("id", "1000");

String age = properties.getProperty("age");
System.out.println(age); //20

注意,由于我们没有为 properties 实例中的 age  键设置任何属性值,所以 properties 实例会转而到 defaultProperties 中查找该值。

 

系统属性

Java 中的“系统属性”对应一个特殊的 Properties 实例,该实例存储的是与当前运行环境相关的系统级属性 —— 这些属性本质上是 Java 虚拟机(JVM)、操作系统配置或应用运行上下文的关键设置(例如操作系统名称、JVM 版本、用户工作目录等)。若需访问这些系统属性,可通过 System.getProperties() 静态方法直接获取整个系统属性的 Properties 实例。例如:

Properties systemProperties = System.getProperties();
System.out.println("java.vm.name=" + systemProperties.getProperty("java.vm.name"));
System.out.println("java.version=" + systemProperties.getProperty("java.version"));

运行结果:

java.vm.name=Java HotSpot(TM) 64-Bit Server VM
java.version=17.0.12

System 类还拥有 getProperty() 和 setProperty() 方法,它们是 System Properties 实例的 Properties 类的 getProperty() 和 setProperty()方法的快捷方式。例如:

Properties systemProperties = System.getProperties();
System.out.println("java.vm.name=" + systemProperties.getProperty("java.vm.name"));
System.out.println("java.version=" + systemProperties.getProperty("java.version"));

System.out.println("java.vm.name=" + System.getProperty("java.vm.name"));
System.out.println("java.version=" + System.getProperty("java.version"));

通过命令行设置Java系统属性

在通过命令行的 java 命令启动 Java 应用程序时,你可以主动设置 Java 系统属性的键值对,这一操作可通过 -D 参数 实现。例如:

java -Dkey1=value -cp . com.hxstrive.Demo

上面命令指示 Java 执行 com.hxstrive.Demo 类,将当前目录用作类路径,并将名为 key1 的系统属性设置为值 value1。

在命令行上设置的系统属性在运行时也可通过系统属性获取。你可以像这样在应用程序内部访问上面提到的key1属性,例如:

String key1Property = System.getProperty("key1");

更多信息参考 https://docs.oracle.com/javase/8/docs/api/java/util/Properties.html API 文档。

  

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
其他应用
公众号