图解Properties数据结构设计与应用案例

200 阅读4分钟

image.png

Properties 是 Java 中的一个类,用于处理配置文件。它继承自 Hashtable 并提供了一种方式来存储和读取键值对,通常用于应用程序的配置数据。Properties 中的键和值都是字符串类型,它支持从文件加载数据、保存数据到文件以及程序运行时的属性查询。由于 Properties 继承自 Hashtable,它是线程安全的,但在处理大量数据时可能不如其他专门的配置管理类高效。

1、 Properties

Properties 是 Java 中的一个类,用于处理属性文件。属性文件是一种将键值对以特定的格式存储在文件中的简单数据存储方式。Properties 类继承自 Hashtable,因此它本质上是一个线程安全的哈希表,其键和值都是字符串。

设计思考:
  1. 需求场景:s
    • 在软件开发中,经常需要将程序的配置信息与代码分离,以便在不同环境中使用不同的配置,而无需修改代码。
    • 适用于需要读取和写入配置文件的场景,如应用程序设置、用户偏好设置等。
  2. 现有技术局限性
    • 在 Properties 类出现之前,配置信息可能以硬编码的形式存在于代码中,或者以非结构化的文本文件存储,这使得配置管理变得困难。
  3. 技术融合
    • Properties 类融合了键值对存储和文件读写的功能,提供了一种简单且标准化的方式来处理配置信息。
  4. 设计理念
    • Properties 类旨在提供一个简单的键值对集合,用于存储和检索属性。它使用标准化的格式读取和写入属性文件,通常以 .properties 为文件扩展名。
  5. 实现方式
    • Properties 类使用一个 Hashtable(在 Java 9 之前)或 HashMap(从 Java 9 开始)来存储键值对。它提供了方法来加载、保存和处理属性文件,这些文件通常以等号(=)分隔键和值,并且支持特定格式的注释。
2、 数据结构

image.png

图说明:
  • Properties:表示 Properties 类的实例,用于处理属性文件。
  • Hash ArrayProperties 使用一个哈希数组来存储桶(Buckets)。
  • Bucket 1 & Bucket 2:哈希数组中的每个桶可以包含一个或多个节点(Node),这些节点存储实际的键值对。
  • Node:每个桶包含多个节点,这些节点存储键值对,并且通过链表连接。
  • Key String:节点中存储的键,是一个字符串。
  • Value String:节点中存储的值,也是一个字符串。
  • Next Node:节点中的引用,指向链表中的下一个节点。
  • Null:链表的末尾节点的 Next Node 指向 Null。
3、 执行流程

image.png

图说明:
  • 创建 Properties 实例:初始化 Properties 对象。
  • 加载属性文件(load) :从文件系统中加载属性文件到 Properties 对象。
  • 读取文件:读取属性文件的内容。
  • 解析键值对:解析文件内容中的键值对。
  • 存储到 HashMap:将解析的键值对存储到 Properties 内部的 HashMap 中。
  • 保存属性文件(store) :将 Properties 对象中的属性保存到文件系统。
  • 写入文件:打开文件并准备写入。
  • 格式化键值对:将 Properties 对象中的键值对格式化为字符串。
  • 获取属性(getProperty) :根据键获取属性值。
  • 查找键值对:在 Properties 内部的 HashMap 中查找键值对。
  • 返回属性值:返回查找到的属性值。

4、优点

  1. 标准化的配置格式
    • 提供了一种广泛认可的格式来存储配置信息,便于理解和使用。
  2. 易于读写
    • 提供了简单的 API 来加载和保存属性文件,方便配置信息的管理。
  3. 与平台无关
    • Properties 类可以处理不同平台的属性文件,支持跨平台的配置管理。

5、缺点

  1. 功能有限
    • Properties 类只支持简单的键值对,不支持复杂的数据结构或数据类型。
  2. 线程不安全
    • Properties 类本身不是线程安全的,需要外部同步来保证线程安全。
  3. 性能开销
    • 对于大型配置文件,Properties 类的加载和保存操作可能会有性能开销。

6、使用场景

  • 应用程序配置
    • 用于存储应用程序的配置信息,如数据库连接字符串、服务器地址等。
  • 用户偏好设置
    • 用于存储用户的个性化设置,如界面主题、语言偏好等。

7、类设计

image.png

8、应用案例

Properties 类常用于读取和存储配置文件。这是一个简单的数据库连接配置加载示例:

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;

public class DatabaseConfigLoader {
    private Properties dbProperties;

    public DatabaseConfigLoader(String configFilePath) {
        dbProperties = new Properties();
        loadDatabaseConfig(configFilePath);
    }

    // 加载数据库配置
    private void loadDatabaseConfig(String configFilePath) {
        try (FileInputStream input = new FileInputStream(configFilePath)) {
            // 加载 properties 文件
            dbProperties.load(input);
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

    // 获取数据库 URL
    public String getDatabaseUrl() {
        return dbProperties.getProperty("db.url");
    }

    // 获取数据库用户名
    public String getDatabaseUsername() {
        return dbProperties.getProperty("db.username");
    }

    // 获取数据库密码
    public String getDatabasePassword() {
        return dbProperties.getProperty("db.password");
    }

    public static void main(String[] args) {
        String configFilePath = "database.properties"; // 配置文件路径
        DatabaseConfigLoader configLoader = new DatabaseConfigLoader(configFilePath);

        // 打印加载的配置信息
        System.out.println("Database URL: " + configLoader.getDatabaseUrl());
        System.out.println("Database Username: " + configLoader.getDatabaseUsername());
        System.out.println("Database Password: " + configLoader.getDatabasePassword());
    }
}