【Java 基础篇】Java Properties 详解:配置文件和键值对存储

news2024/11/26 21:48:48

在这里插入图片描述

在 Java 编程中,配置文件和键值对存储是非常常见的需求,用于存储应用程序的配置参数、用户首选项、国际化信息等。Java 提供了 Properties 类来处理这种类型的数据,它是一个轻量级的配置文件和键值对存储工具。本文将详细介绍 Java 的 Properties 类,向您展示如何使用它来管理配置数据。

什么是 Properties?

Properties 是 Java 标准库中的一个类,用于处理配置文件和键值对存储。它继承自 Hashtable 类,因此可以存储一组键值对,其中键和值都是字符串类型。这使得 Properties 成为一种理想的配置文件格式,因为它是文本文件,易于创建、编辑和维护。

创建 Properties 对象

要使用 Properties 类,首先需要创建一个 Properties 对象。以下是如何创建 Properties 对象的示例:

import java.util.Properties;

public class PropertiesExample {
    public static void main(String[] args) {
        Properties properties = new Properties();
    }
}

现在,我们有了一个名为 propertiesProperties 对象,可以使用它来存储键值对数据。

添加和获取属性

Properties 对象提供了多种方法来添加和获取属性。最常用的方法是 setPropertygetProperty

添加属性

使用 setProperty 方法可以向 Properties 对象中添加属性,如下所示:

properties.setProperty("database.url", "jdbc:mysql://localhost:3306/mydb");
properties.setProperty("database.username", "user123");
properties.setProperty("database.password", "secretpassword");

在上面的示例中,我们添加了三个属性,分别是数据库连接 URL、用户名和密码。

获取属性

使用 getProperty 方法可以获取属性的值,如下所示:

String url = properties.getProperty("database.url");
String username = properties.getProperty("database.username");
String password = properties.getProperty("database.password");

现在,我们可以获取数据库连接 URL、用户名和密码的值。

从文件加载 Properties

通常,配置数据存储在文件中,我们可以使用 load 方法从文件加载 Properties。以下是如何从文件加载 Properties 的示例:

import java.io.FileInputStream;
import java.io.IOException;

public class LoadPropertiesFromFileExample {
    public static void main(String[] args) {
        Properties properties = new Properties();
        try (FileInputStream fis = new FileInputStream("config.properties")) {
            properties.load(fis);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

在上面的示例中,我们使用 FileInputStream 打开一个配置文件(假设文件名为 config.properties),然后使用 load 方法加载文件中的属性。这将文件中的键值对数据加载到 Properties 对象中。

将 Properties 写入文件

除了从文件加载 Properties,我们还可以使用 store 方法将 Properties 中的属性写入文件。以下是如何将 Properties 写入文件的示例:

import java.io.FileOutputStream;
import java.io.IOException;

public class StorePropertiesToFileExample {
    public static void main(String[] args) {
        Properties properties = new Properties();
        properties.setProperty("database.url", "jdbc:mysql://localhost:3306/mydb");
        properties.setProperty("database.username", "user123");
        properties.setProperty("database.password", "secretpassword");

        try (FileOutputStream fos = new FileOutputStream("config.properties")) {
            properties.store(fos, "Database Configuration");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

在上面的示例中,我们首先将属性设置到 Properties 对象中,然后使用 FileOutputStream 打开一个文件(假设文件名为 config.properties),最后使用 store 方法将 Properties 写入文件。

默认值

如果在尝试获取属性值时属性不存在,getProperty 方法将返回 null。为了避免 null 值,我们可以在 getProperty 方法中提供默认值,如下所示:

String url = properties.getProperty("database.url", "jdbc:mysql://localhost:3306/defaultdb");

在上面的示例中,如果 database.url 属性不存在,url 变量将包含默认值 "jdbc:mysql://localhost:3306/defaultdb"

遍历 Properties

如果需要遍历 Properties 中的所有属性,可以使用 propertyNames 方法,如下所示:

Enumeration<?> propertyNames = properties.propertyNames();
while (propertyNames.hasMoreElements()) {
    String key = (String) propertyNames.nextElement();
    String value = properties.getProperty(key);
    System.out.println(key + ": " + value);
}

上面的代码将列出 Properties 中的所有属性和它们的值。

更多用法

当使用 Properties 类时,还有一些有用的方法和技巧可以帮助您更好地管理配置数据。以下是一些 Properties 的更多用法:

  1. 默认属性值: 您可以使用 setProperty 方法设置属性的默认值,以便在未找到属性时返回默认值。这对于确保配置的某些属性始终具有值非常有用。

    properties.setProperty("database.maxConnections", "10");
    
  2. 移除属性: 如果要删除属性,可以使用 remove 方法。

    properties.remove("database.password");
    
  3. 获取属性名列表: 如果需要获取所有属性名的列表,可以使用 stringPropertyNames 方法。

    Set<String> propertyNames = properties.stringPropertyNames();
    
  4. 注释: 您可以为 store 方法提供注释,以使配置文件更易于理解。

    properties.store(outputStream, "Database Configuration");
    
  5. 默认属性: Properties 对象可以有一个默认属性列表,这些属性将在没有在主属性列表中找到属性时返回。

    Properties defaults = new Properties();
    defaults.setProperty("database.maxConnections", "10");
    
    Properties properties = new Properties(defaults);
    
  6. 加载资源文件: 除了从文件加载,您还可以使用 ClassLoader 加载资源文件中的属性。

    InputStream inputStream = getClass().getResourceAsStream("/config.properties");
    properties.load(inputStream);
    
  7. 保存和加载 XML 格式的 Properties: 您可以使用 storeToXMLloadFromXML 方法来保存和加载 XML 格式的 Properties

    properties.storeToXML(outputStream, "Database Configuration", "UTF-8");
    properties.loadFromXML(inputStream);
    
  8. 特殊字符转义: 如果属性值中包含特殊字符(例如冒号、等号、换行符等),可以使用 Propertiesload 方法来正确地转义和解析这些字符。

    properties.setProperty("specialChars", "This is a colon : and this is an equal sign =");
    properties.store(outputStream, "Properties with special characters");
    

这些技巧和方法可以帮助您更好地使用 Properties 类来管理和处理配置数据。根据您的具体需求,选择适合的方法和技巧,以便更有效地处理和维护您的配置文件和键值对数据。

注意事项

当使用 Properties 类来处理配置文件时,有一些注意事项需要考虑,以确保您的应用程序能够正常运行并维护配置数据的一致性。以下是一些 Properties 使用的注意事项:

  1. 字符编码问题: 默认情况下,Properties 使用 ISO 8859-1 字符编码。如果您的配置文件包含非拉丁字符集的字符,应该使用包含字符编码的 ReaderInputStream 来加载配置文件,以确保字符正确解析。例如:

    InputStreamReader reader = new InputStreamReader(inputStream, "UTF-8");
    properties.load(reader);
    
  2. 属性键和值的限制: 属性键和值不能包含换行符或冒号等特殊字符,因为这些字符被用作属性文件的分隔符。如果需要在属性值中包含这些字符,可以进行适当的转义。

  3. 注释的保存: 使用 store 方法保存属性文件时,注释会丢失。如果需要保留注释,可以考虑使用 XML 格式的配置文件,其中注释信息可以更容易地保留。

  4. 属性名的大小写敏感性: Properties 类在默认情况下对属性名不区分大小写。这意味着 getProperty("example")getProperty("EXAMPLE") 将返回相同的值。如果需要区分大小写,请使用 setPropertygetProperty 方法的重载版本来进行区分。

  5. 默认属性的使用: 当创建 Properties 对象时,您可以指定默认属性。这些默认属性将在主属性列表中找不到属性时返回。确保仅将通用的默认属性添加到默认属性列表中,以避免混淆。

  6. 安全性考虑: 在某些情况下,配置文件可能包含敏感信息,如密码。请确保配置文件的安全性,避免将敏感信息存储为纯文本。一种安全的方法是使用加密或其他安全措施来保护敏感信息。

  7. 线程安全性: Properties 类不是线程安全的。如果多个线程同时访问和修改 Properties 对象,可能会导致并发问题。在多线程环境中使用时,请考虑使用同步机制或线程安全的集合来确保数据一致性。

  8. 异常处理: 在加载配置文件或访问属性值时,请考虑异常处理。例如,在加载配置文件时,捕获 IOException;在访问属性值时,捕获 NullPointerExceptionClassCastException,以避免应用程序崩溃。

  9. 备份和版本控制: 定期备份您的配置文件,并使用版本控制工具来跟踪配置文件的更改。这有助于恢复以前的配置状态,并确保配置文件的历史记录。

  10. 文档和注释: 在配置文件中添加注释和文档,以帮助其他开发人员理解配置项的用途和取值范围。这将有助于维护和协作。

遵循这些注意事项将有助于确保您的 Properties 配置文件的可靠性和可维护性,同时提高应用程序的稳定性。

总结

Properties 类是 Java 中处理配置文件和键值对存储的一种简单且强大的方式。通过创建 Properties 对象,我们可以轻松地添加、获取和管理属性。此外,我们还可以从文件加载 Properties,将 Properties 写入文件,并设置默认值,以满足各种配置需求。希望本文能帮助您更好地理解和使用 Properties 类,以便在 Java 应用程序中有效地管理配置数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1023562.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

看顶级测工怎么玩转Apifox接口测试工具

一、Apifox简介 官网地址&#xff1a;https://www.apifox.cn/?utm_sourceczzl 1、Apifox 定位 Apifox Postman Swagger Mock JMeterApifox 是 API 文档、API 调试、API Mock、API 自动化测试一体化协作平台。通过一套系统、一份数据&#xff0c;解决多个系统之间的数据同…

嵌入式养成计划-29-网络编程----TCP与UDP的基础模型

Linux下&#xff0c;基于TCP与UDP协议&#xff0c;不同进程下单线程通信服务器 Linux下&#xff0c;基于TCP与UDP协议&#xff0c;不同进程下单线程通信服务器 六十五、TCP与UDP的基础模型 1. socket 1.1 套接字概念 最早的套接字和共享内存&#xff0c;消息队列&#xff…

坚鹏:郴州市银行业协会BLM银行数字化转型战略培训圆满结束

郴州市银行业协会BLM银行数字化转型战略培训圆满结束 在数字化转型背景下&#xff0c;郴州市银行业协会为了落实监管政策《关于银行业保险业数字化转型的指导意见》&#xff0c;充分认识到学习银行银行数字化转型战略的价值和重要性&#xff0c;特别举办《2023年数字化转型战略…

10.4 稳压管稳压电路

虽然整流滤波电路能将正弦交流电压变换成较为平滑的直流电压&#xff0c;但是&#xff0c;一方面&#xff0c;由于输出电压平均值取决于变压器副边电压有效值&#xff0c;所以当电网电压波动时&#xff0c;输出电压平均值将随之产生相应的波动&#xff1b;另一方面&#xff0c;…

Qt --- Day03

<?xml version"1.0" encoding"UTF-8"?> <ui version"4.0"><class>Widget</class><widget class"QWidget" name"Widget"><property name"geometry"><rect><x>0…

halcon对比度增强

halcon对比度增强 emphasize open_framegrabber (GigEVision2, 0, 0, 0, 0, 0, 0, progressive, -1, default, -1, false, default, b0b35368a72b_GEV_MVCS00410GM, 0, -1, AcqHandle) grab_image_start (AcqHandle, -1)while (true)grab_image_async (Image, AcqHandle, -1)d…

【VS2019 Qt5 VTK9.2】界面编程问题解决记录

一、Qt和VTK相关问题及解决 1. Widget和Viewer的设置顺序 imageViewer->SetupInteractor(renderWindow->GetInteractor());ui.qvtkWidget->setRenderWindow(imageViewer->GetRenderWindow());二者顺序决定了能否正确显示。 参考&#xff1a;QVTKWidget和vtkImageV…

RocketMQ 源码分析——分布式事务方案

文章目录 消息队列解决事务存在的问题RocketMQ的分布式事务方案RocketMQ的分布式事务案例代码分布式事务源码分析消息发送源码分析确认/回滚源码分析回查源码分析 总结 消息队列解决事务存在的问题 如果使用消息队列解决事务在哪个阶段向MQ发送消息&#xff1f; 先扣款后再向R…

计算机算法分析与设计(3)---循环赛日程表(含代C++码)

循环赛日程表 一、内容概述二、代码实现2.1 分治代码2.2 结果图 一、内容概述 二、代码实现 2.1 分治代码 // 循环赛日程表 #include<iostream> #include<cmath> using namespace std;void schedule(int k, int n, int** array) // 数组下标从1开始 {for (int …

【操作系统】聊聊文件系统是如何工作的

文件系统其实是操作系统中存储的核心、计算、网络。除了使用寄存器、内存可以临时存储数据&#xff0c;使用磁盘持久化存储更重要。 磁盘为系统提供了数据持久化功能。文件系统在磁盘的基础上&#xff0c;抽象出了一个管理文件的树状结构 索引节点和目录项 Linux中一切皆是文…

HTTP请求、响应详解

目录 一、HTTP请求详解 1.1 认识请求“报头”&#xff08;header&#xff09; 1.2 认识请求“正文”&#xff08;body&#xff09; 1.2.1 application/x-www-form-urlencoded 1.2.2 multipart/form-data 1.2.3 application/json 二、HTTP响应详解 2.1 认识状态码 2.2 认识响…

Centos7配置国内yum源

目录 备份原系统中的repo文件配置国内开源镜像重新生成yum缓存 备份原系统中的repo文件 cd /etc/yum.repos.d/mkdir repo_bakmv *.repo repo_bak/配置国内开源镜像 到网易和阿里开源镜像站点下载系统对应版本的repo文件 curl -O http://mirrors.aliyun.com/repo/Centos-7.re…

com.google.gson.internal.LinkedTreeMap cannot be cast to XXX

起因是在对google商品做本地缓存时&#xff0c;上线后发现的bug 刚开始非常自信&#xff0c;debug没问题线上有问题&#xff0c;大概率就是混淆文件没有添加keep&#xff0c;于是本地添加对SDK中类的keep&#xff0c;本地打包release验证&#xff0c;不出意外还是崩溃 仔细看…

GEE:Bfast时间序列扰动检测

本文记录了 Google Earth Engine &#xff08;GEE&#xff09; 上 Bfast 时间序列检测的APP和gitHub链接。 文章目录 一、APP Bfast APP&#xff1a; [https://andreim.users.earthengine.app/view/bfastmonitor](https://andreim.users.earthengine.app/view/bfastmonitor)git…

C语言——通讯录管理系统

通讯录管理系统项目简介 功能说明 控制台黑窗口实现程序需要满足以下几个功能 程序开始运行时首先显示选择菜单界面&#xff0c;根据用户输入确定实现何种功能 程序界面 代码实现 多文件实现 和之前写的实战项目类似&#xff0c;这里同样采用多文件实现的方式 多文件写代码…

5G先锋开道,护航出行安全

“道路千万条&#xff0c;安全第一条”。 交通作为城市生命线“主动脉”&#xff0c;承载着助推经济发展的重要使命。构建“预、防、治”全周期交通管理&#xff0c;推进城市精细化管理刻不容缓。 为全面加强交通安全监管体系&#xff0c;天津某交管局决策对新区街道4000多个路…

计算机二级-简单应用题

题目要求 编写代码&#xff0c;以实现如下功能&#xff1a; 键盘输入小明学习的课程名称及考分等信息&#xff0c;信息间采用空格分隔&#xff0c;每个课程一行&#xff0c;空行回车结束录入&#xff0c;示例格式如下&#xff1a; 数学 90 语文 95 英语 86 物理 84 生物 87 屏幕…

(二)随机变量的数字特征:探索概率分布的关键指标

文章目录 &#x1f34b;1. 随机变量的数学期望&#x1f34b;1.1 离散型随机变量的数学期望&#x1f34b;1.2 连续型随机变量的数学期望 &#x1f34b;2. 随机变量函数的数学期望&#x1f34b;2.1 一维随机变量函数的数学期望&#x1f34b;2.2 二维随机变量函数的数学期望 &…

机器学习算法基础--逻辑回归

目录 1.数据收集及处理 2.数据提取及可视化 3.逻辑回归训练样本并且测试 4.绘制散点决策边界 逻辑回归的方法已经在数学建模里面讲过了&#xff0c;这里就不多讲了。 本篇我们主要是利用逻辑回归的方法来求解分类问题。 1.数据获取及处理 import pandas as pd from sklearn…

蓝桥杯2023年第十四届省赛真题-像素放置

目录 蓝桥杯2023年第十四届省赛真题-像素放置 题目描述 输入格式 输出格式 样例输入 样例输出 提示 【思路解析】 【代码实现】 大家觉得写得可以的话&#xff0c;可以加入QQ群907575059. 蓝桥杯2023年第十四届省赛真题-像素放置 时间限制: 3s 内存限制: 320MB 提交:…