properties配置和读取
如何配置和读取属性文件
- 1.属性文件介绍
- 1.1 什么是属性文件
- 1.2属性文件规范
- 1.3 属性文件优缺点
- 2.属性文件读取
- 4.spring和属性文件
- 4.1利用注解读取
- 4.2配置文件里直接引用
- 4.属性文件写入
- 5.注意事项
- 5.总结
1.属性文件介绍
1.1 什么是属性文件
Java开发中,我们经常需要读取和写入配置文件,用来存储程序中的一些配置信息,例如数据库的连接信息、邮件和Web服务器的信息、消息队列的信息等等。配置文件一般都是key-value形式,且它的key-value一般都是String-String类型的,因此我们完全可以用Map<String, String>来表示它。
但因为配置文件特别常用,所以Java集合库给我们提供了一个Properties类来表示一组“配置”,专门用来处理key-value形式的配置信息。Properties类可以表示一个持久的属性集,每个键及其对应的值都是字符串类型,它可以把配置信息保存在一个IO流中,或是从一个IO流中加载配置信息,因此很适合用来处理配置文件。
Properties的内部本质上是一个Hashtable,该类从Hashtable中继承了get()和put()方法,这些方法的参数签名是Object。但由于历史遗留原因,Properties的设计实际上是有问题的,不过为了保持兼容性,现在已经没法修改了。所以我们在使用Properties时,不要去调用这些从Hashtable继承来的方法,而应该使用Properties自身关于读写配置的方法,比如getProperty()和setProperty()等方法。
1.2属性文件规范
1.属性文件都是以键值对出现
key=value
2.注释用#开头
3.增加可读性,key很多时候都用xx.xxx表示
eg:
#log4j属性配置
log4j.rootLogger=DEBUG,A
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=[%t] [%c]-[%p] %m%n# properties文件示例
# 注释内容以#号开头
name=Tom
age=22
gender=Male
1.3 属性文件优缺点
1、Properties文件的优点:
(1)Properties文件结构简单,易于读写、解析。
(2)Properties文件的扩展性强,可以随时添加、修改、删除属性。
(3)Properties文件可以存储键值对类型的数据,非常通用。
(4)Properties文件具有跨平台性,可以在不同操作系统上使用。
2、Properties文件的缺点:
(1)Properties文件对复杂结构和大量数据的支持不够好。
(2)Properties文件格式和内容没有规范,容易产生格式错误、解析异常等问题。
3、注意事项:
(1)Properties文件不是加密文件,存储敏感信息时建议进行加密处理。
(2)Properties文件的编码一般使用ISO-8859-1,建议不要使用Unicode编码。
2.属性文件读取
属性文件本身是一个文件,要读取一个文件,需要获得这个文件的InputStream。
在利用Properties类起封装文件流,就可以用getProperty(key)读取属性值
java提供了多种方式,如果属性文件放置在类目录下,用 ClassLoader.getSystemResourceAsStream是最推荐的。其中最容易出错的是文件路径的定位
| 方法 | 说明 |
|---|---|
| this.getClass().getClassLoader().getResourceAsStream(fileName) | 默认从class根目录,不加/ |
| this.getClass().getResourceAsStream(fileName) | 默认当前class目录,从根目录算,要加/ |
| ClassLoader.getSystemResourceAsStream(fileName) | 默认从class根目录,不加/ |
| new FileInputStream(fileName) | 绝对路径,不推荐 |
| reader = new FileReader(fileName) | 绝对路径,不推荐 |
| Resource resource = new ClassPathResource(fileName); | 等价ClassLoader |
| ResourceBundle rb2 = ResourceBundle.getBundle(fileName); | 等价ClassLoader |
package com.jsoft.test;import org.junit.Test;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PropertiesLoaderUtils;import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.util.Map;
import java.util.Properties;
import java.util.ResourceBundle;/*** @class: com.jsoft.test.PropertiesTest* @description:* @author: jiangzengkui* @company: 教育家* @create: 2023-12-07 23:07*/
public class PropertiesTest {/*** 1. 方式一* 从当前的类加载器的this.getClass().getResourcesAsStream来获取* InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(name)* 前提:属性文件必须放置在类的目录结构里* 文件路径判断:* this.getClass().getResourceAsStream是从当前类去寻找资源* 1.如果不加路径,则从当前class类的目录里找* 2.如果有路径,但没有根路径,则从当前类的子目录找* eg:* 当前类:com.jsoft.MyProper* this.getClass().getClassLoader().getResourceAsStream("user/user.properties")* 是寻找com.jsoft.user类目录里是否有属性文件* @throws IOException* 3.如果有路径,而且有根路径,则从classes根目录找* this.getClass().getResourceAsStream("/com/jsoft/test/user/user1.properties");*/@Testpublic void t1() throws IOException {InputStream inputStream=null;inputStream = this.getClass().getResourceAsStream("user.properties");inputStream = this.getClass().getResourceAsStream("user/user.properties");inputStream = this.getClass().getResourceAsStream("/com/jsoft/test/user/user1.properties");inputStream = this.getClass().getResourceAsStream("/log4j.properties");printProper(inputStream);}/*** 2. 方式二* this.getClass().getClassLoader()是获得java类加载器ClassLoader* ClassLoader.getResourceAsStream默认就是从根目录加载,路径不能从/开始* 如:log4j.properties就表示从class根目录了,加/log4j.properties反而出错* @throws IOException*/@Testpublic void t2() throws IOException {InputStream inputStream=null;//放在在class根目录inputStream = this.getClass().getClassLoader().getResourceAsStream("log4j.properties");//放置在classpath/com/jsoft/testinputStream = this.getClass().getClassLoader().getResourceAsStream("com/jsoft/test/user.properties");//放置在classpath/com/jsoft/test/userinputStream = this.getClass().getClassLoader().getResourceAsStream("com/jsoft/test/user/user1.properties");printProper(inputStream);}/*** 3.方式三:* 直接用类加载器的静态方法* ClassLoader.getSystemResourceAsStream()* 等价于* this.getClass().getClassLoader().getResourceAsStream()* 对路径的要求也是一样,都是不需要加根路径/* @throws IOException*/@Testpublic void t3() throws IOException {InputStream inputStream=null;//放在在class根目录inputStream = ClassLoader.getSystemResourceAsStream("log4j.properties");//放置在classpath/com/jsoft/testinputStream = ClassLoader.getSystemResourceAsStream("com/jsoft/test/user.properties");//放置在classpath/com/jsoft/test/userinputStream = ClassLoader.getSystemResourceAsStream("com/jsoft/test/user/user1.properties");printProper(inputStream);}/*** 4.方法四* 用FileInputStream(文件)获取文件流,这种方法:* 1.取工程的路径* 2.取绝对路径* 这个方法适用于属性文件没有放置classses目录下,用绝对路径可访问,原则不推荐* @throws IOException*/@Testpublic void t4() throws IOException {InputStream inputStream=null;inputStream=new FileInputStream("src/main/resources/log4j.properties");inputStream=new FileInputStream("target/classes/log4j.properties");inputStream=new FileInputStream("D:/java/idea_project/mybatis/basic/target/classes/log4j.properties");printProper(inputStream);}/*** 5. 方法五* 使用 FileReader reader = new FileReader(fileName)* 和FileInputStream一样,也需要绝对路径,不推荐* @throws IOException*/@Testpublic void t5()throws IOException {FileReader reader = new FileReader("D:/java/idea_project/mybatis/basic/target/classes/log4j.properties");Properties properties=new Properties();properties.load(reader);printProper(properties);}/*** 6.方法六* spring提供的帮助类* 和ClassLoader一样,不需要根路径*/@Testpublic void t6() throws IOException {Resource resource = new ClassPathResource("log4j.properties");Properties properties = PropertiesLoaderUtils.loadProperties(resource);printProper(properties);}/*** 7.方法七* ResourceBundle.getBundle的路径访问和 Class.getClassLoader.getResourceAsStream类似,* 默认从根目录下读取,也可以读取resources目录下的文件* ResourceBundle rb = ResourceBundle.getBundle("b")* 不需要指定文件名的后缀,只需要写文件名前缀即可* 可用ResourceBundle.getString(key)取值*/@Testpublic void t7() throws IOException {//读取class根路径的log4j.properties文件,不需要文件后缀ResourceBundle rb2 = ResourceBundle.getBundle("log4j");//可用ResourceBundle.getString(key)取值System.out.println("log4j.appender.A1==="+rb2.getString("log4j.appender.A1"));for(String key : rb2.keySet()){String value = rb2.getString(key);System.out.println(key + ":" + value);}}/*** 获得属性值* @param inputStream* @param key* @return* @throws IOException*/public static String getVal( InputStream inputStream,String key) throws IOException {Properties properties=new Properties();properties.load(inputStream);return properties.getProperty(key);}public static void printProper(InputStream inputStream)throws IOException {Properties properties=new Properties();properties.load(inputStream);for(Map.Entry<Object, Object> entry: properties.entrySet()){System.out.println(entry.getKey()+"="+entry.getValue());}}public static void printProper(Properties properties)throws IOException {for(Map.Entry<Object, Object> entry: properties.entrySet()){System.out.println(entry.getKey()+"="+entry.getValue());}}
}
4.spring和属性文件
4.1利用注解读取
配置里面注入属性文件
<context:property-placeholder location="classpath:salesman.properties"/><!-- 或者多个 --><bean id="cfgproperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean"><property name="locations"><list><value>WEB-INF/config/jdbc.properties</value><value>WEB-INF/config/product.properties</value><value>WEB-INF/config/mail.properties</value><value>WEB-INF/config/ding.properties</value></list></property><qualifier value="main"/></bean>
<!-- 属性文件读取 --><bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"><property name="properties" ref="cfgproperties" /><property name="fileEncoding" value="utf-8" /></bean>
在Java中使用这个@Value(“${ }”)注解 读取 properties中的参数
@Value("${filePath}") private String filePath;public void setFilePath(String filePath) {System.out.println(filePath);this.filePath = filePath;
}
4.2配置文件里直接引用
直接用${key}取值
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"><property name="driverClass" value="${jdbc.driverClassName}" /><property name="jdbcUrl" value="${jdbc.url}" /><property name="user" value="${jdbc.username}" /><property name="password" value="${jdbc.password}" /><property name="autoCommitOnClose" value="true"/><property name="checkoutTimeout" value="${cpool.checkoutTimeout}"/><property name="initialPoolSize" value="${cpool.minPoolSize}"/><property name="minPoolSize" value="${cpool.minPoolSize}"/><property name="maxPoolSize" value="${cpool.maxPoolSize}"/><property name="maxIdleTime" value="${cpool.maxIdleTime}"/><property name="acquireIncrement" value="${cpool.acquireIncrement}"/><property name="maxIdleTimeExcessConnections" value="${cpool.maxIdleTimeExcessConnections}"/></bean>
4.属性文件写入
写入属性文件不常用
// 代码示例:写入Properties文件
Properties prop = new Properties(); // 创建Properties对象
OutputStream out = new FileOutputStream("config.properties"); // 创建输出流
prop.setProperty("name", "Tom"); // 设置属性名和属性值
prop.setProperty("age", "22");
prop.store(out, "Properties example"); // 将Properties对象写入Properties文件
5.注意事项
1、Properties文件的优点:
(1)Properties文件结构简单,易于读写、解析。
(2)Properties文件的扩展性强,可以随时添加、修改、删除属性。
(3)Properties文件可以存储键值对类型的数据,非常通用。
(4)Properties文件具有跨平台性,可以在不同操作系统上使用。
2、Properties文件的缺点:
(1)Properties文件对复杂结构和大量数据的支持不够好。
(2)Properties文件格式和内容没有规范,容易产生格式错误、解析异常等问题。
3、注意事项:
(1)Properties文件不是加密文件,存储敏感信息时建议进行加密处理。
(2)Properties文件的编码一般使用ISO-8859-1,建议不要使用Unicode编码。
5.总结
Properties文件是Java中一种存储配置文件的文件类型,其通过键值对的形式存储数据,通常用于存储应用程序的配置信息、国际化内容、资源文件等。在Java中, Properties文件可以通过java.util.Properties类进行读写操作。Properties文件结构简单,易于读写、解析,扩展性强,并且具有跨平台性。但它也有局限性,对于复杂结构和大量数据的支持不够好,容易产生格式错误、解析异常等问题。
相关文章:
properties配置和读取
如何配置和读取属性文件 1.属性文件介绍1.1 什么是属性文件1.2属性文件规范1.3 属性文件优缺点 2.属性文件读取4.spring和属性文件4.1利用注解读取4.2配置文件里直接引用 4.属性文件写入5.注意事项5.总结 1.属性文件介绍 1.1 什么是属性文件 Java开发中,我们经常需…...
如何利用人工智能+物联网技术实现自动化设备生产
随着科技的发展与行业竞争的日益激烈,制造业也逐渐走向智能化发展。制造业的改革是利用物联网技术和自动化设备,实现生产线的智能化和自适应生产,优化生产流程,提高生产效率和质量,为企业创造更大的价值。 方案概述 智…...
STM32CubeMx+MATLAB Simulink串口输出实验
STM32CubeMxMATLAB Simulink串口输出实验 📌《STM32CubeMxMATLAB Simulink点灯程序》📍相关篇《MATLAB Simulink STM32硬件在环 (HIL)实现例程测试》🔖需要的软件支持包:Embedded Coder Support Package fo…...
React中每次渲染都会传入一个新的props.children到子组件?
传入props.children后, 为什么会导致组件的重新渲染? 问题描述 在 react 中, 我想要对组件的渲染进行优化, 遇到了一个非常意思的问题, 当我向一个组件中传入了 props.children 之后, 每次父组件重新渲染都会导致这个组件的重新渲染; 它看起来的表现就像是被memo包…...
Qt 通过命令行编译程序
前言 从服务器拉代码到编译成可执行文件一个脚本解决问题。使用的项目文件见上一个文章 Qt生成动态链接库并使用动态链接库 脚本代码 为了方便易懂这是一个很简单的Qt编译脚本 call E:\vs2015\VC\vcvarsall.bat x86 rmdir /s /q my-project git clone gitgitee.com:wenbai1…...
WireShark监控浏览器登录过程网络请求
软件开发中经常前后端扯皮。一种是用Chrome浏览器的开发者工具 来看网络交互,但是前提是 网络端口的确是通的。 WireShark工作在更低层。 这个工具最大的好处,大家别扯皮,看网络底层的log,到底 你的端口开没开, 数据…...
202301209将RK3399的挖掘机开发板在Android10下设置系统默认为24小时制
202301209将RK3399的挖掘机开发板在Android10下设置系统默认为24小时制 2023/12/9 22:07 应该也可以适用于RK3399的Android12系统 --- a/frameworks/base/packages/SettingsProvider/res/values/defaults.xml b/frameworks/base/packages/SettingsProvider/res/values/default…...
智能优化算法应用:基于法医调查算法无线传感器网络(WSN)覆盖优化 - 附代码
智能优化算法应用:基于法医调查算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于法医调查算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.法医调查算法4.实验参数设定5.算法结果6.参考…...
使用MfgTool烧写工具烧写自制系统
一. 简介 本文我们就来学习,如何将我们编译的 uboot,zImage(内核镜像),xxx.dtb设备树文件,还有制作的根文件系统,这四个文件烧写到开发板中,最后 开发板能正常启动。 上一篇文章说…...
react中使用react-konva实现画板框选内容
文章目录 一、前言1.1、API文档1.2、Github仓库 二、图形2.1、拖拽draggable2.2、图片Image2.3、变形Transformer 三、实现3.1、依赖3.2、源码3.2.1、KonvaContainer组件3.2.2、use-key-press文件 3.3、效果图 四、最后 一、前言 本文用到的react-konva是基于react封装的图形绘…...
es6 相关面试总结
1、es6 是什么 新一代的js 语言标准,对其核心做了升级优化,更加适合大型应用开发。 2、箭头函数优缺点 优点: 1.代码优化 2.this 指向不会变动,永远指向其父元素 缺点: 1.没有arguments 参数 2.不能通过 appl…...
【Hive】——数据仓库
1.1 数仓概念 数据仓库(data warehouse):是一个用于存储,分析,报告的数据系统 目的:是构建面向分析的集成化数据环境,分析结果为企业提供决策支持 特点: 数据仓库本身不产生任何数据…...
算法基础九
螺旋矩阵2 给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix。 示例 1: 输入:n 3 输出:[[1,2,3],[8,9,4],[7,6,5]] 示例 2: 输入:n …...
QT-在ui界面中给QWidget增加Layout布局的两种方法
2023-12-05 QT-在ui界面中给QWidget增加Layout布局的两种方法 方式一 在UI界面,用拖拽的方式加入Layout方式二 用notepad软件打开.ui文件,手动加入Layout代码 目标:去除右下角红标,给tab标签增加Layout属性。 方式一 在UI界面&am…...
免费的网页数据抓取工具有哪些?【2024附下载链接】
在网络上,有许多网页数据抓取工具可供选择。本文将探讨其如何全网采集数据并支持指定网站抓取。我们将比较不同的数据采集工具,帮助您找到最适合您需求的工具。 网页数据抓取工具种类 在选择网页数据抓取工具之前,让我们先了解一下这些工具…...
报错:Parsed mapper file: ‘file mapper.xml 导致无法启动
报错 : Logging initialized using class org.apache.ibatis.logging.stdout.StdOutImpl adapter. Registered plugin: com.github.yulichang.interceptor.MPJInterceptor3b2c8bda Parsed mapper file: file [/Mapper.xml] application无法启动 我这边产生原因是项…...
Linux驱动开发学习笔记2《LED驱动开发试验》
目录 一、Linux下LED灯驱动原理 1.地址映射 二、硬件原理图分析 三、实验程序编写 1.LED 灯驱动程序编写 2.编写测试APP 四、运行测试 1.编译驱动程序和测试APP (1)编译驱动程序 (2)编译测试APP 2.运行测试 一、Linux下…...
hive数据库查看参数/hive查看当前环境配置
文章目录 一、hive查看当前环境配置命令 在一次hive数据库执行命令 set ngmr.exec.modecluster时,想看一下 ngmr.exec.mode参数原先的值是什么,所以写一下本篇博文,讲一下怎么查看hive中的参数。 一、hive查看当前环境配置命令 set &#…...
ajax中get和post的区别,datatype返回的数据类型有哪些?web开发中数据提交的几种方式,有什么区别。百度使用哪种方式?
在Ajax中,GET和POST是两种常见的HTTP请求方法。它们有以下区别: GET请求:使用GET请求时,参数数据会附加在URL的末尾,以查询字符串的形式发送给服务器。GET请求是幂等的,也就是说多次发送相同的GET请求&…...
STM32用flash保存参数实现平衡擦写的一种方法
#FLASH平衡擦写# 一、概述 简易示意图如下: 写参数前要擦除对应的扇区 全为0XFFFFFFFF操作的最小单位为32位 uint32_t; 当一块扇区写完时,将所有有用参数复制到第二块扇区,开始写新的参数,如果所有参数写完,又重第…...
相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...
MySQL 知识小结(一)
一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...
【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论
路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中(图1): mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...
站群服务器的应用场景都有哪些?
站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...
Vue 3 + WebSocket 实战:公司通知实时推送功能详解
📢 Vue 3 WebSocket 实战:公司通知实时推送功能详解 📌 收藏 点赞 关注,项目中要用到推送功能时就不怕找不到了! 实时通知是企业系统中常见的功能,比如:管理员发布通知后,所有用户…...
