【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 类是一个常见的用于管理配置信息的工具,它可以被看作是一种键值对的集合。虽然 Properties 通常用于处理配置文件,但它实际上也可以作为通用的 Map 集合来使用。在本文中,我们将详细探讨如何使用 Properties 作为 Map 集…...
数字孪生体标准编程
数字孪生体标准 括ISO TC184/SC4正在制定数字孪生制造标准ISO 23247、ISO/IEC JTC1/AG11正在推动数字孪生体标准、IEEE P2806正在做有关“数字表达”的标准。赢家通吃的标准战 卡尔夏皮罗和哈尔范里安撰写了《信息规则:网络经济战略指南》(Information R…...

力扣 -- 394. 字符串解码
解题方法: 参考代码: 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?说说你的思路
🎬 岸边的风:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想,就是为了理想的生活 ! 目录 一、什么是虚拟DOM 二、为什么需要虚拟DOM 三、如何实现虚拟DOM 小结 一、什么是虚拟DOM 虚拟 DOM (…...

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

高端知识竞赛中用到的软件和硬件有哪些
现在单位搞知识竞赛,已不满足于用PPT放题,找几个简单的抢答器、计分牌弄一下了,而是对现场效果和科技感要求更高了。大屏要分主屏侧屏,显示内容要求丰富炫酷;选手和评委也要用到平板等设备;计分要大气些&am…...
Vue 3.3 发布
本文为翻译 原文地址:宣布推出 Vue 3.3 |The Vue Point (vuejs.org) 今天我们很高兴地宣布 Vue 3.3 “Rurouni Kenshin” 的发布! 此版本侧重于开发人员体验改进 - 特别是 TypeScript 的 SFC <script setup> 使用。结合 Vue Language Tools&…...
算法|图论 3
LeetCode 130- 被围绕的区域 题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 题目描述:给你一个 m x n 的矩阵 board ,由若干字符 X 和 O ,找到所有被 X 围绕的区域,并将这些区域…...

【数据结构】二叉树的层序遍历(四)
目录 一,层序遍历概念 二,层序遍历的实现 1,层序遍历的实现思路 2,创建队列 Queue.h Queue.c 3,创建二叉树 BTree.h BTree.c 4,层序遍历的实现 一,层序遍历概念 层序遍历:除了先序…...

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

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

vant 按需导入 vue2
vant 按需导入 vue2 1、通过npm安装 # Vue 3 项目,安装最新版 Vant: npm i vant -S# Vue 2 项目,安装 Vant 2: npm i vantlatest-v2 -S2、自动按需引入组件 babel-plugin-import 是一款 babel 插件,它会在编译过程中…...
Java手写分治算法和分治算法应用拓展案例
Java手写分治算法和分治算法应用拓展案例 1. 算法思维导图 以下是用Mermanid代码表示的分治算法的实现原理: #mermaid-svg-nvJwIm97kPHEXQOR {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-nvJwIm97kP…...
学习 CodeWhisperer 的一些总结
目前一些常见的的 AI 工具 GitHub Copilot:GitHub 与 OpenAI 合作开发的一个人工智能助手。 Codeium:是一个免费的人工智能驱动的代码生成工具 Tabnine:一个自动代码生成工具,免费版本非常有限,只提供简短的代码完成…...

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

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

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

十一、MySql的事务(上)
文章目录 一、引入(一)CURD不加控制,会有什么问题?(二)CURD满足什么属性,能解决上述问题? 二、什么是事务?三、事务的特性(一)原子性:…...
时间序列分析1--生成和导出时间序列数据
时间序列数据的生成 直接录入 1.行录入 ts.(price,startc(2015,1),frequency 12) # price为时间序列变量,start为起始读入时间 frequncy指定每年读入的数据的频率,frequncy4为季度数据、frequncy52为星期数据 2.列录入 scan() 1:101 ....6:7 7:…...

HarmonyOS应用开发—资源分类与访问
应用开发过程中,经常需要用到颜色、字体、间距、图片等资源,在不同的设备或配置中,这些资源的值可能不同。 应用资源:借助资源文件能力,开发者在应用中自定义资源,自行管理这些资源在不同的设备或配置中的表…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...

19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...

【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...

Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...