在Java里如何开发简单配置管理系统_Java文件与集合项目说明
发布时间 - 2026-02-02 00:00:00 点击率:次Properties 是 Java 自带最轻量配置方案,需用 UTF-8 Reader/Writer 避免中文乱码;建议封装 Config 类安全转换类型;热更新应校验文件修改时间并线程安全替换;集合配置用分号分隔,避免 JSON。
用 Properties 读写配置文件最直接
Java 自带的 java.util.Properties 是处理键值对配置文件(如 app.properties)最轻量、最稳妥的选择,无需引入第三方依赖,且天然支持 ISO-8859-1 编码(中文需显式指定 UTF-8)。
常见错误是直接用 load(InputStream) 读取含中文的文件,结果乱码——因为默认按 ISO-8859-1 解析。正确做法是用 load(Reader) 并传入 UTF-8 InputStreamReader:
Properties props = new Properties();
try (InputStream is = getClass().getResourceAsStream("/config/app.properties");
Reader reader = new InputStreamReader(is, StandardCharsets.UTF_8)) {
props.load(reader);
}
写入时同理,用 store(Writer, comment) 替代 store(OutputStream, comment),避免写入后中文变成问号。
把配置映射到 Java 对象要用 Configuration 或手动封装
纯 Properties 只提供字符串键值,无法自动转成 int、boolean 或嵌套结构。如果项目稍复杂(比如有数据库连接池参数),建议封装一层:
- 定义一个
Config类,字段
对应配置项,加 getter;
- 构造时传入
Properties,在内部用getProperty("key", "default")安全读取; - 数值类型用
Integer.parseInt()或Boolean.parseBoolean()转换,并捕获NumberFormatException做降级处理。
不推荐直接用反射或通用 BeanUtils 自动填充——配置缺失或类型错配时失败位置难定位,反而增加调试成本。
配置热更新不能靠 Properties::load 简单重载
很多开发者以为“每次读配置前重新 load 一次文件”就算热更新,但这样存在两个问题:
- 文件未修改时重复 IO,浪费资源;
- 多线程并发读写时,可能读到半截内容(
Properties不是线程安全的)。
可行方案是:用 Files.getLastModifiedTime(path) 检查时间戳变化,仅当变更后才重建 Properties 实例,并用 volatile 字段或 AtomicReference 替换旧实例。更稳妥的做法是加一层简单锁(如 synchronized 块)保护加载过程。
集合类配置项要约定分隔符,别硬解析 JSON
如果需要配置“允许的 IP 列表”或“日志级别白名单”,不要在 .properties 里写 JSON 字符串(如 allowed_ips=[\"127.0.0.1\",\"192.168.1.0/24\"])。JSON 解析依赖额外库,且易因格式错误导致整个配置加载失败。
统一用简单分隔符,比如逗号或分号:
allowed_ips=127.0.0.1;192.168.1.0/24;10.0.0.0/8
读取后用 String.split(";") 得到 String[],再 Arrays.asList() 转为 List。注意 trim 每个元素,防止空格干扰。
路径、URL、正则等含特殊字符的值,用双引号包裹并手动去引号,比强行兼容 JSON 更可控。
# java
# js
# json
# 编码
# app
# 中文乱码
# stream
# 配置文件
# 键值对
# String
# Integer
# Boolean
# 封装
# 字符串
# int
# volatile
# 值类型
# 线程
# 多线程
# 并发
# 对象
# default
# 数据库
# 自带
# 键值
# 最轻
# 加载
# 分隔符
# 要用
# 第三方
# 只提供
# 后才
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
深圳网站制作培训,深圳哪些招聘网站比较好?
5种Android数据存储方式汇总
Laravel如何处理跨站请求伪造(CSRF)保护_Laravel表单安全机制与令牌校验
如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南
制作旅游网站html,怎样注册旅游网站?
教你用AI将一段旋律扩展成一首完整的曲子
如何在云主机上快速搭建网站?
Laravel如何实现模型的全局作用域?(Global Scope示例)
Python自然语言搜索引擎项目教程_倒排索引查询优化案例
如何在万网自助建站平台快速创建网站?
Laravel定时任务怎么设置_Laravel Crontab调度器配置
独立制作一个网站多少钱,建立网站需要花多少钱?
如何用AI帮你把自己的生活经历写成一个有趣的故事?
Laravel中的Facade(门面)到底是什么原理
uc浏览器二维码扫描入口_uc浏览器扫码功能使用地址
Android中AutoCompleteTextView自动提示
HTML 中如何正确使用模板变量为元素的 name 属性赋值
Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】
香港网站服务器数量如何影响SEO优化效果?
Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】
如何快速启动建站代理加盟业务?
弹幕视频网站制作教程下载,弹幕视频网站是什么意思?
html5的keygen标签为什么废弃_替代方案说明【解答】
Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案
如何在景安云服务器上绑定域名并配置虚拟主机?
*服务器网站为何频现安全漏洞?
Python文件操作最佳实践_稳定性说明【指导】
免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?
如何破解联通资金短缺导致的基站建设难题?
使用Dockerfile构建java web环境
深圳网站制作平台,深圳市做网站好的公司有哪些?
图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?
Laravel怎么使用Intervention Image库处理图片上传和缩放
Windows Hello人脸识别突然无法使用
如何在云服务器上快速搭建个人网站?
安克发布新款氮化镓充电宝:体积缩小 30%,支持 200W 输出
JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)
深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?
Laravel中间件如何使用_Laravel自定义中间件实现权限控制
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
javascript如何操作浏览器历史记录_怎样实现无刷新导航
如何将凡科建站内容保存为本地文件?
轻松掌握MySQL函数中的last_insert_id()
Bootstrap整体框架之CSS12栅格系统
微信小程序 wx.uploadFile无法上传解决办法
Linux后台任务运行方法_nohup与&使用技巧【技巧】
高防网站服务器:DDoS防御与BGP线路的AI智能防护方案
实现点击下箭头变上箭头来回切换的两种方法【推荐】
武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?
微信小程序 scroll-view组件实现列表页实例代码


