在Java中如何编写配置文件读取工具_JavaProperties实战解析
发布时间 - 2026-01-24 00:00:00 点击率:次Java读取.properties文件最稳妥方式是用Properties类配合ClassLoader.getResourceAsStream()并指定UTF-8编码,避免硬编码路径、文件流及默认编码问题;它不支持嵌套和变量引用,多环境需手动切换文件,Properties非线程安全但只读操作安全,热更新应借助配置中心。
Java里读取.properties文件最稳妥的方式是用Properties类配合ClassLoader.getResourceAsStream()
硬编码FileInputStream路径或直接用new FileInputStream("config.properties")在打包成.jar后必然失败——资源不在文件系统里,而在JAR包内。必须走类路径加载。
常见错误现象:FileNotFoundException、空配置、中文乱码(尤其Windows下默认GBK写入但UTF-8读取)。
- 始终用
getClass().getClassLoader().getResourceAsStream("config.properties"),不要拼绝对路径 - 如果文件在
src/main/resources下,传入的路径就是"config.properties";若在子目录如conf/,则写"conf/config.properties" - 显式指定字符集:
properties.load,避免JDK版本差异导致默认编码不一致
(new InputStreamReader(input, StandardCharsets.UTF_8))
为什么Properties.load()不支持嵌套和变量引用?
Properties本质是Hashtable的子类,只处理key=value扁平结构,不解析占位符(如${db.url})、不支持层级(如database.host只是普通key,不是嵌套对象)。
这意味着:你不能靠原生Properties实现类似Spring Boot的@Value("${redis.port}")或YAML那种缩进结构。
- 若需要变量替换,得自己扫描
value中的${...}并递归替换(注意循环引用风险) - 若需分组管理,只能按命名约定,比如用
redis.host、redis.port,再用string.startsWith("redis.")筛选 - 别试图重写
load()去支持JSON/YAML语法——那是配置中心或第三方库(如Apache Commons Configuration)的事
多环境配置怎么切?Java原生Properties没内置profile机制
Spring Boot的application-dev.properties是框架层抽象,java.util.Properties本身不识别环境后缀。你得手动控制加载哪个文件。
典型做法是通过JVM参数或系统属性决定加载路径:
String env = System.getProperty("env", "prod");
String fileName = "config-" + env + ".properties";
InputStream is = MyClass.class.getClassLoader().getResourceAsStream(fileName);
- 确保所有环境配置文件都放在
resources目录下,且命名统一(如config-dev.properties、config-test.properties) - 启动时加
-Denv=dev,否则默认加载config-prod.properties - 别依赖
os.name自动切环境——开发机是Mac、测试机是Linux、生产是CentOS,逻辑会失控
性能与线程安全:Properties实例能不能复用?
Properties不是线程安全的,但load()只在初始化时调用一次;之后的getProperty()是只读操作,无并发问题。真正要注意的是“何时加载”和“是否重复加载”。
- 用静态块或
static final Properties保证单例加载,避免每次调用都打开流、解析文本 - 不要在方法里反复
new Properties().load(...)——IO开销大,且可能因编码不一致导致两次读出不同结果 - 如果配置需热更新(如ZooKeeper推送),原生
Properties不适用,得自己加监听+原子替换引用(例如用AtomicReference)
复杂点在于:一旦引入热加载,就必须考虑旧配置正在被业务线程读取,新旧切换的可见性边界。这时候别硬刚,直接上Consul或Nacos客户端更省心。
# linux
# java
# redis
# centos
# js
# json
# windows
# apache
# 编码
# app
# 工具
# ssl
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何实现API版本控制_Laravel API版本化路由设计策略
ChatGPT 4.0官网入口地址 ChatGPT在线体验官网
js实现点击每个li节点,都弹出其文本值及修改
Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤
Laravel Eloquent关联是什么_Laravel模型一对一与一对多关系精讲
如何快速重置建站主机并恢复默认配置?
Laravel怎么实现软删除SoftDeletes_Laravel模型回收站功能与数据恢复【步骤】
HTML5打空格有哪些误区_新手常犯的空格使用错误【技巧】
Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】
七夕网站制作视频,七夕大促活动怎么报名?
免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?
如何确保西部建站助手FTP传输的安全性?
html5如何实现懒加载图片_ intersectionobserver api用法【教程】
Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】
如何在沈阳梯子盘古建站优化SEO排名与功能模块?
Laravel安装步骤详细教程_Laravel环境搭建指南
Laravel中间件起什么作用_Laravel Middleware请求生命周期与自定义详解
1688铺货到淘宝怎么操作 1688一键铺货到自己店铺详细步骤
详解jQuery停止动画——stop()方法的使用
JavaScript如何实现错误处理_try...catch如何捕获异常?
Laravel如何实现用户角色和权限系统_Laravel角色权限管理机制
javascript事件捕获机制【深入分析IE和DOM中的事件模型】
JavaScript实现Fly Bird小游戏
如何在自有机房高效搭建专业网站?
如何在建站主机中优化服务器配置?
Laravel如何实现RSS订阅源功能_Laravel动态生成网站XML格式订阅内容【教程】
Laravel怎么实现模型属性转换Casting_Laravel自动将JSON字段转为数组【技巧】
laravel怎么为API路由添加签名中间件保护_laravel API路由签名中间件保护方法
标题:Vue + Vuex + JWT 身份认证的正确实践与常见误区解析
如何在阿里云香港服务器快速搭建网站?
手机网站制作与建设方案,手机网站如何建设?
如何在万网主机上快速搭建网站?
手机怎么制作网站教程步骤,手机怎么做自己的网页链接?
JavaScript如何实现继承_有哪些常用方法
Laravel如何实现登录错误次数限制_Laravel自带LoginThrottles限流配置【方法】
JS碰撞运动实现方法详解
Win11怎么开启自动HDR画质_Windows11显示设置HDR选项
香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南
JS经典正则表达式笔试题汇总
米侠浏览器网页图片不显示怎么办 米侠图片加载修复
Python进程池调度策略_任务分发说明【指导】
网易LOFTER官网链接 老福特网页版登录地址
Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案
如何快速上传自定义模板至建站之星?
用yum安装MySQLdb模块的步骤方法
Bootstrap CSS布局之列表
Laravel中间件如何使用_Laravel自定义中间件实现权限控制
Laravel如何使用withoutEvents方法临时禁用模型事件
高性价比服务器租赁——企业级配置与24小时运维服务
Laravel如何优化应用性能?(缓存和优化命令)
下一篇:如何将项目添加到gitee上
下一篇:如何将项目添加到gitee上


