当前位置: 首页 > 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;自行管理这些资源在不同的设备或配置中的表…...

C++中的转换构造函数

在 C/C++ 中,不同的数据类型之间可以相互转换。无需用户指明如何转换的称为自动类型转换(隐式类型转换),需要用户显式地指明如何转换的称为强制类型转换。 自动类型转换示例: int a = 6;a = 7.5 + a; 编译器对 7.5 是作为 double 类型处理的,在求解表达式时,先将 a 转换…...

JSP ssm 特殊人群防走失系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 JSP ssm 特殊人群防走失系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源 代码和数据库&#xff0c;系统主要…...

怎么实现一个登录时需要输入验证码的功能

今天给项目换了一个登录页面&#xff0c;而这个登录页面设计了验证码&#xff0c;于是想着把这个验证码功能实现一下吧。 这篇文章就如何实现登录时的验证码的验证功能结合代码进行详细地介绍&#xff0c;以及介绍功能实现的思路。 目录 页面效果 实现思路 生成验证码的控制…...

在android工程中新建Android模块报错

复制了复制正常的build.gradle文件&#xff0c;然后把theme里面的东西改成了下面这个样就好了 <resources xmlns:tools"http://schemas.android.com/tools"><!-- Base application theme. --><style name"Theme.JiQuan" parent"Theme…...

电脑桌面的复选框如何取消

电脑桌面图标的复选框如何取消 1. 概述2. 去掉图标的复选框方法结束语 1. 概述 当你拿到新的电脑开机后&#xff0c;发现桌面上软件应用的图标左上角有个小框&#xff0c;每次点击图标都会显示&#xff0c;并且点击图标时&#xff0c;小框还会打上√&#xff1b; 这个小框的…...

【Unity每日一记】资源加载相关和检测相关

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;uni…...

【数据结构】长篇详解堆,堆的向上/向下调整算法,堆排序及TopK问题

文章目录 堆的概念性质图解 向上调整算法算法分析代码整体实现 向下调整算法算法分析整体代码实现 堆的接口实现初始化堆销毁堆插入元素删除元素打印元素判断是否为空取首元素实现堆 堆排序创建堆调整堆整合步骤 TopK问题 堆的概念 堆就是将一组数据所有元素按完全二叉树的顺序…...

DAQ高频量化平台:引领Ai高频量化交易模式变革

近年来&#xff0c;数字货币投资市场掀起了一股热潮&#xff0c;以&#xff08;BTC&#xff09;为代表的区块链技术带来了巨大的商业变革。数字资产的特点&#xff0c;如无国界、无阶级、无门槛、高流动性和高透明度&#xff0c;吸引了越来越多的人们的关注和认可&#xff0c;创…...

vue3 element plus获取el-cascader级联选择器选中的当前结点的label值 附vue2获取当前label

各位大佬&#xff0c;有时我们在处理级联选择组件数据时&#xff0c;不仅需要拿到id,还需要拿到label名称&#xff0c;但是通常组件直接绑定的是id,所以就需要我们用别的方法去拿到label,此处官方是有这个方法的&#xff0c;具体根据不同的element 版本进行分别处理。 VUE3 e…...

Spring Boot常见面试题

Spring Boot简介 Spring Boot 是由 Pivotal 团队提供&#xff0c;用来简化 Spring 应用创建、开发、部署的框架。它提供了丰富的Spring模块化支持&#xff0c;可以帮助开发者更轻松快捷地构建出企业级应用。Spring Boot通过自动配置功能&#xff0c;降低了复杂性&#xff0c;同…...

推广英文/对网站提出的优化建议

# begin build properties # autogenerated by buildinfo.sh #由buildinfo.sh自动生成此文件ro.build.idA4-3G #手机ID号ro.build.display.idQUALCOMM 高通3G-Android2.2.3-IOSUI#显示型号 eng.autobuild.20110624.181135#显示创建时间ro.build.version.incrementaleng.autobui…...

28网站制作/推广策略都有哪些

需求&#xff1a;一开始返回顶部图标是隐藏的&#xff0c;当滚动到指定位置的时候&#xff0c;小图标就会显示出来&#xff0c;&#xff0c;点击图标&#xff0c;会缓动的返回顶部 技术点&#xff1a;window.scrollTo(x,y)&#xff0c;浏览器显示区域跳转到指定的坐标 <!DOC…...

公司网站建设开发/谷歌浏览器网页版

类的属性都是存放在字典中&#xff0c;所以对类或实例的属性进行操作实际上就是对字典的操作。类的属性相关操作如下图&#xff1a;代码块如下:class Door():"门的类"address "浙江省杭州市"def __init__(self,size,color,type):#构造函数"初始化门的…...

中国品牌网官网查询/百度seo关键词排名查询

今天数据迁移的小组找到我&#xff0c;希望我能够重新构建一些测试环境&#xff0c;其中测试环境中的一些分区表都需要去掉分区&#xff0c;转换成普通表的形式&#xff0c;因为他们在做一些工作的时候碰到了问题&#xff0c;而且希望必要的约束等都保留&#xff0c;这个需求听…...

无锡专业做网站的公司/淘宝关键词工具

在前面的一篇文章 “Elasticsearch&#xff1a;创建属于自己的 Ingest processor” 中&#xff0c;我相信地介绍了如何使用一个模板来创建 Ingest 插件。在今天的文章中&#xff0c;我们使用另外一个方法来做同样的事。我们将使用 eclipse 来生成一个 maven 的项目。 前言 El…...

无锡网站建设维护/湖南网络推广排名

最近开发了一个数据解析程序&#xff0c;需要显示10W的设备数据&#xff0c;采用了DataGridView 虚拟模式&#xff0c;效率非常高&#xff0c;但是使用中也遇到了一个奇葩的问题&#xff0c;微软MSN上面好像没有说到这个情况&#xff0c;比如我有10多列&#xff0c;界面默认只能…...