当前位置: 首页 > news >正文

【Java 基础篇】Properties 结合集合类的使用详解

在这里插入图片描述

Java 中的 Properties 类是一个常见的用于管理配置信息的工具,它可以被看作是一种键值对的集合。虽然 Properties 通常用于处理配置文件,但它实际上也可以作为通用的 Map 集合来使用。在本文中,我们将详细探讨如何使用 Properties 作为 Map 集合,以及它的一些常见用法。

什么是 Properties?

Properties 是 Java 核心库中的一个类,它继承自 Hashtable,主要用于管理键值对形式的配置信息。这些键值对被存储在一个 .properties 文件中,通常采用以下格式:

key1=value1
key2=value2
key3=value3

在配置文件中,键名和对应的值之间用等号(或冒号)分隔。每个键值对通常表示一个配置项。

Properties 作为 Map 集合的基本用法

创建 Properties 对象

首先,让我们看看如何创建和初始化一个 Properties 对象作为 Map 集合使用:

Properties properties = new Properties();

添加键值对

可以使用 setProperty 方法添加键值对,就像操作普通的 Map 一样:

properties.setProperty("name", "John");
properties.setProperty("age", "30");

获取值

要获取某个键的值,可以使用 getProperty 方法:

String name = properties.getProperty("name");
String age = properties.getProperty("age");

遍历键值对

可以使用 entrySet 方法遍历 Properties 中的所有键值对:

for (Map.Entry<Object, Object> entry : properties.entrySet()) {String key = (String) entry.getKey();String value = (String) entry.getValue();System.out.println(key + ": " + value);
}

移除键值对

如果需要移除某个键值对,可以使用 remove 方法:

properties.remove("age");

Properties 的高级用法

从文件加载配置

Properties 还可以从外部配置文件加载配置信息。假设有一个名为 config.properties 的配置文件:

db.url=jdbc:mysql://localhost:3306/mydb
db.username=admin
db.password=secret

您可以使用以下方式加载配置信息:

try (FileInputStream fileInputStream = new FileInputStream("config.properties")) {properties.load(fileInputStream);
} catch (IOException e) {e.printStackTrace();
}

将 Properties 写入文件

您还可以将 Properties 对象中的配置信息写入到文件中:

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

默认值

Properties 允许您为配置项设置默认值。如果某个配置项不存在,将返回默认值:

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

使用 Properties 默认值

Java 提供了一个便捷的方法来获取系统级配置,该配置是 Properties 的默认值。您可以使用 System.getProperties() 来获取系统级配置,并将其视为 Properties 对象:

Properties systemProperties = System.getProperties();
String javaVersion = systemProperties.getProperty("java.version");

Properties 作为通用的 Map 集合

尽管 Properties 主要用于配置文件,但它实际上是一个通用的 Map 集合,因此也可以用于其他用途。以下是一些示例用法:

存储和检索自定义对象

您可以使用 Properties 存储和检索自定义对象。需要将自定义对象序列化为字符串,然后存储它们:

Person person = new Person("Alice", 25);
String serializedPerson = serializePerson(person);
properties.setProperty("person", serializedPerson);

然后,您可以获取并反序列化该对象:

String serializedPerson = properties.getProperty("person");
Person person = deserializePerson(serializedPerson);

用于缓存

Properties 可以用作简单的缓存,将数据存储在内存中以提高访问速度:

// 存储数据到缓存
properties.setProperty("cacheKey", "cachedValue");// 从缓存中获取数据
String cachedValue = properties.getProperty("cacheKey");

用于国际化

在国际化应用程序中,Properties 可用于存储本地化资源的键值对:

properties.setProperty("welcome.message", "Welcome to our application!");
properties.setProperty("error.message", "An error occurred.");

然后,根据用户的本地化设置,可以获取相应的消息。

实例总结

创建 Properties 对象

要使用 Properties,首先需要创建一个 Properties 对象,然后加载配置文件。下面是创建 Properties 对象并加载配置文件的示例:

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;public class ConfigLoader {public static Properties loadConfig(String filePath) {Properties properties = new Properties();try {FileInputStream fileInputStream = new FileInputStream(filePath);properties.load(fileInputStream);fileInputStream.close();} catch (IOException e) {e.printStackTrace();}return properties;}
}

读取配置项

一旦配置文件加载到 Properties 对象中,您可以使用 getProperty 方法来获取特定配置项的值。例如:

Properties config = ConfigLoader.loadConfig("app.properties");
String dbUrl = config.getProperty("db.url");
String dbUser = config.getProperty("db.username");
String dbPassword = config.getProperty("db.password");

修改配置项

要修改配置项的值,可以使用 setProperty 方法。例如:

config.setProperty("app.title", "My Awesome App");
config.setProperty("app.version", "1.0");

保存配置

修改配置后,您可以使用 store 方法将更改后的配置保存回文件。例如:

try {FileOutputStream fileOutputStream = new FileOutputStream("app.properties");config.store(fileOutputStream, "Updated App Configuration");fileOutputStream.close();
} catch (IOException e) {e.printStackTrace();
}

使用 Properties 存储列表

假设您需要配置一个邮件服务器的多个 SMTP 地址。可以使用逗号分隔的字符串将它们存储在 Properties 中:

config.setProperty("mail.smtp.servers", "smtp1.example.com,smtp2.example.com,smtp3.example.com");

然后,您可以使用 split 方法将它们拆分为列表:

String smtpServers = config.getProperty("mail.smtp.servers");
List<String> smtpServerList = Arrays.asList(smtpServers.split(","));

使用 Properties 存储映射

如果您需要配置键值对的映射,也可以使用 Properties 来存储它们。例如,您可以配置数据库连接池的参数:

config.setProperty("db.connection.pool.size", "10");
config.setProperty("db.connection.timeout", "30000");

然后,您可以使用 getProperty 方法将它们提取到映射中:

int connectionPoolSize = Integer.parseInt(config.getProperty("db.connection.pool.size"));
int connectionTimeout = Integer.parseInt(config.getProperty("db.connection.timeout"));Map<String, Integer> dbConfig = new HashMap<>();
dbConfig.put("connectionPoolSize", connectionPoolSize);
dbConfig.put("connectionTimeout", connectionTimeout);

使用 Properties 存储自定义对象

有时,配置数据可能更复杂,需要存储

自定义对象。在这种情况下,您可以将对象序列化为字符串,然后存储在 Properties 中。例如,假设您需要配置一个用户对象:

User user = new User("john.doe", "John Doe", 30);
String serializedUser = serializeUser(user);
config.setProperty("user.data", serializedUser);

然后,您可以使用 getProperty 方法获取字符串,并将其反序列化为对象:

String serializedUser = config.getProperty("user.data");
User user = deserializeUser(serializedUser);

总结

Properties 是 Java 中处理配置文件的强大工具,它易于使用且适用于许多应用程序。通过结合使用 Properties 和集合类,您可以更灵活地管理和操作配置数据,以满足各种不同的需求。不过,在处理更复杂的配置数据时,请确保数据的一致性和安全性,以及适当的异常处理,以提高应用程序的稳定性和可维护性。

希望本文对您理解如何使用 Properties 和集合类来管理配置文件有所帮助。

相关文章:

【Java 基础篇】Properties 结合集合类的使用详解

Java 中的 Properties 类是一个常见的用于管理配置信息的工具&#xff0c;它可以被看作是一种键值对的集合。虽然 Properties 通常用于处理配置文件&#xff0c;但它实际上也可以作为通用的 Map 集合来使用。在本文中&#xff0c;我们将详细探讨如何使用 Properties 作为 Map 集…...

数字孪生体标准编程

数字孪生体标准 括ISO TC184/SC4正在制定数字孪生制造标准ISO 23247、ISO/IEC JTC1/AG11正在推动数字孪生体标准、IEEE P2806正在做有关“数字表达”的标准。赢家通吃的标准战 卡尔夏皮罗和哈尔范里安撰写了《信息规则&#xff1a;网络经济战略指南》&#xff08;Information R…...

力扣 -- 394. 字符串解码

解题方法&#xff1a; 参考代码&#xff1a; class Solution{ public:string decodeString(string s){stack<string> sst;stack<int> dst;//防止字符串栈为空的时候再追加字符串到栈顶元素sst.push("");int n s.size();int i 0;while(i<n)//最好不…...

面试官:什么是虚拟DOM?如何实现一个虚拟DOM?说说你的思路

&#x1f3ac; 岸边的风&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 一、什么是虚拟DOM 二、为什么需要虚拟DOM 三、如何实现虚拟DOM 小结 一、什么是虚拟DOM 虚拟 DOM &#xff08…...

Ubuntu安装中文拼音输入法

ubuntu安装中文拼音输入法 ubuntu版本为23.04 1、安装中文语言包 首先安装中文输入法必须要让系统支持中文语言&#xff0c;可以在 Language Support 中安装中文语言包。 添加或删除语音选项&#xff0c;添加中文简体&#xff0c;然后会有Applying changes的对话框&#x…...

高端知识竞赛中用到的软件和硬件有哪些

现在单位搞知识竞赛&#xff0c;已不满足于用PPT放题&#xff0c;找几个简单的抢答器、计分牌弄一下了&#xff0c;而是对现场效果和科技感要求更高了。大屏要分主屏侧屏&#xff0c;显示内容要求丰富炫酷&#xff1b;选手和评委也要用到平板等设备&#xff1b;计分要大气些&am…...

Vue 3.3 发布

本文为翻译 原文地址&#xff1a;宣布推出 Vue 3.3 |The Vue Point (vuejs.org) 今天我们很高兴地宣布 Vue 3.3 “Rurouni Kenshin” 的发布&#xff01; 此版本侧重于开发人员体验改进 - 特别是 TypeScript 的 SFC <script setup> 使用。结合 Vue Language Tools&…...

算法|图论 3

LeetCode 130- 被围绕的区域 题目链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 题目描述&#xff1a;给你一个 m x n 的矩阵 board &#xff0c;由若干字符 X 和 O &#xff0c;找到所有被 X 围绕的区域&#xff0c;并将这些区域…...

【数据结构】二叉树的层序遍历(四)

目录 一&#xff0c;层序遍历概念 二&#xff0c;层序遍历的实现 1&#xff0c;层序遍历的实现思路 2&#xff0c;创建队列 Queue.h Queue.c 3&#xff0c;创建二叉树 BTree.h BTree.c 4&#xff0c;层序遍历的实现 一&#xff0c;层序遍历概念 层序遍历&#xff1a;除了先序…...

macOS文件差异比较最佳工具:Beyond Compare 4

Beyond Compare for mac是一款Scooter Software研发的文件同步对比工具。你可以选择针对多字节的文本、文件夹、源代码&#xff0c;甚至是支持比对adobe文件、pdf文件或是整个驱动器&#xff0c;检查其文件大小、名称、日期等信息。你也可以选择使用Beyond Compare合并两个不同…...

Windows+Pycharm 如何创建虚拟环境

当我们开发一个别人的项目的时候,因为项目里有很多特有的包,比如 Pyqt5.我们不想破坏电脑上原来的包版本,这个时候,新建一个虚拟环境,专门针对这个项目就很有必要了. 简略步骤: 1.新建虚拟环境 1.打开 pycharm 终端(Terminal)安装虚拟环境工具: pip install virtualenv2.创…...

vant 按需导入 vue2

vant 按需导入 vue2 1、通过npm安装 # Vue 3 项目&#xff0c;安装最新版 Vant&#xff1a; npm i vant -S# Vue 2 项目&#xff0c;安装 Vant 2&#xff1a; npm i vantlatest-v2 -S2、自动按需引入组件 babel-plugin-import 是一款 babel 插件&#xff0c;它会在编译过程中…...

Java手写分治算法和分治算法应用拓展案例

Java手写分治算法和分治算法应用拓展案例 1. 算法思维导图 以下是用Mermanid代码表示的分治算法的实现原理&#xff1a; #mermaid-svg-nvJwIm97kPHEXQOR {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-nvJwIm97kP…...

学习 CodeWhisperer 的一些总结

目前一些常见的的 AI 工具 GitHub Copilot&#xff1a;GitHub 与 OpenAI 合作开发的一个人工智能助手。 Codeium&#xff1a;是一个免费的人工智能驱动的代码生成工具 Tabnine&#xff1a;一个自动代码生成工具&#xff0c;免费版本非常有限&#xff0c;只提供简短的代码完成…...

JavaScript 中的 `this` 指向问题与其在加密中的应用

JS中的 this 关键字是一个非常重要的概念&#xff0c;它在不同情况下会指向不同的对象或值。在本文中&#xff0c;我们将深入探讨 JavaScript 中 this 的各种情况&#xff0c;并思考如何将其应用于 JS加密中的一些有趣用途。 1. 全局上下文中的 this 在全局上下文中&#xff…...

深入理解算法的时间复杂度

文章目录 时间复杂度的定义时间复杂度的分类时间复杂度分析常见数据结构和算法的时间复杂度常见数据结构常见算法 常见排序算法说明冒泡排序(Bubble Sort)快速排序(Quick Sort)归并排序(Merge Sort)堆排序(Heap Sort) 时间复杂度的定义 时间复杂度就是一种用来描述算法在输入规…...

2023年度教育部人文社会科学研究一般项目评审结果,已公布!

【SciencePub学术】 9月15日&#xff0c;教育部社科司公示了2023年度教育部人文社会科学研究一般项目评审结果&#xff0c;共3482项。 其中&#xff0c;规划基金、青年基金、自筹经费项目共3029项通过专家评审&#xff1b;西部和边疆地区项目200项&#xff0c;新疆项目20项&a…...

十一、MySql的事务(上)

文章目录 一、引入&#xff08;一&#xff09;CURD不加控制&#xff0c;会有什么问题&#xff1f;&#xff08;二&#xff09;CURD满足什么属性&#xff0c;能解决上述问题&#xff1f; 二、什么是事务&#xff1f;三、事务的特性&#xff08;一&#xff09;原子性&#xff1a;…...

时间序列分析1--生成和导出时间序列数据

时间序列数据的生成 直接录入 1.行录入 ts.(price,startc(2015,1),frequency 12) # price为时间序列变量&#xff0c;start为起始读入时间 frequncy指定每年读入的数据的频率&#xff0c;frequncy4为季度数据、frequncy52为星期数据 2.列录入 scan() 1:101 ....6:7 7:…...

HarmonyOS应用开发—资源分类与访问

应用开发过程中&#xff0c;经常需要用到颜色、字体、间距、图片等资源&#xff0c;在不同的设备或配置中&#xff0c;这些资源的值可能不同。 应用资源&#xff1a;借助资源文件能力&#xff0c;开发者在应用中自定义资源&#xff0c;自行管理这些资源在不同的设备或配置中的表…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook&#xff0c;用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途&#xff0c;下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败&#xff0c;具体原因是客户端发送了密码认证请求&#xff0c;但Redis服务器未设置密码 1.为Redis设置密码&#xff08;匹配客户端配置&#xff09; 步骤&#xff1a; 1&#xff09;.修…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

面向无人机海岸带生态系统监测的语义分割基准数据集

描述&#xff1a;海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而&#xff0c;目前该领域仍面临一个挑战&#xff0c;即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

Mysql8 忘记密码重置,以及问题解决

1.使用免密登录 找到配置MySQL文件&#xff0c;我的文件路径是/etc/mysql/my.cnf&#xff0c;有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...

MinIO Docker 部署:仅开放一个端口

MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...