当前位置:首页 > 虚拟主机 > 正文

如何正确读取properties配置文件?读取properties配置文件的几种方式

读取properties配置文件的核心结论

读取properties配置文件是Java企业级开发中最基础也最关键的环节。正确的读取方式不仅要实现功能,更要兼顾编码处理、性能表现和可维护性,本文直接给出核心结论:生产环境禁止使用Properties.load()裸读,必须采用编码显式声明、统一封装管理、缓存优化读取的三层方案,下面从基础实现、进阶优化、云端部署三个维度展开。

properties文件读取的主流方式对比

传统java.util.Properties方式

这是最原始也最直接的读取方式,通过Properties类的load()方法加载文件流。核心代码实现

Properties props = new Properties(); InputStream input = new FileInputStream("config.properties"); props.load(input); String value = props.getProperty("database.url");

此方式存在的致命缺陷

  • 默认使用ISO-8859-1编码,中文注释和值必然乱码
  • 每次读取都会创建新实例,在高并发场景下性能低下
  • 路径硬编码,在打包成jar或部署到云端后无法定位文件
  • 缺少类型转换能力,所有值都是String类型

ResourceBundle资源绑定方式

Java提供了ResourceBundle类专用于properties读取,支持国际化特性

ResourceBundle bundle = ResourceBundle.getBundle("config"); String url = bundle.getString("database.url");

该方式的优势在于不需要关心物理路径,类加载器会自动搜索classpath下的资源,但它依然没有解决编码问题

,且只适合读取不频繁变更的静态配置。

Spring框架的@Value注解方式

使用Spring框架的项目可以借助@Value注解载入配置,代码极其简洁

@Component public class DatabaseConfig { @Value("${database.url}") private String url; }

Spring Boot进一步支持@ConfigurationProperties绑定到Java对象,实现类型安全的配置读取,这是开发效率最高的方案,但严重依赖于Spring容器环境,在纯Java项目中无法使用。

解决编码乱码与安全问题的专业方案

统一使用UTF-8编码读取

任何一种读取方式都建议明确指定UTF-8编码

Properties props = new Properties(); Reader reader = new InputStreamReader( new FileInputStream("config.properties"), StandardCharsets.UTF_8); props.load(reader);

使用PropertiesLoader工具类封装

推荐在企业项目中构建统一的配置加载工具类,解决散落读取问题:

@Component public class PropertiesLoader { private static final Properties GLOBAL_CONFIG = new Properties(); static { try (InputStream in = PropertiesLoader.class.getClassLoader().getResourceAsStream("application.properties")) { GLOBAL_CONFIG.load(new InputStreamReader(in, StandardCharsets.UTF_8)); } catch (IOException e) { throw new RuntimeException("核心配置文件加载失败", e); } } public static String getValue(String key) { String value = GLOBAL_CONFIG.getProperty(key); if (StringUtils.isBlank(value)) { throw new IllegalArgumentException("配置项" + key + "不存在"); } return value; } }

该工具类实现启动时加载一次,运行期内存读取,同时提供缺失校验功能。

敏感配置项加密处理

properties文件中禁止存放明文密码,生产环境应结合Jasypt等加密框架,对配置值进行加密存储、运行时解密读取。

西西云环境下的云端配置读取实践

经验案例:

在西西云服务器上部署Spring Boot应用时,我们曾遇到一个典型的配置读取陷阱:本地开发环境正常,部署到云端后应用启动报错“找不到配置文件”,排查后发现是文件路径硬编码导致的

专业解决方案分三步:

  • 配置外置:将application.properties放置在西西云服务器的/etc/appname/目录下,启动命令追加--spring.config.location=file:/etc/appname/application.properties,这样做的好处是配置与代码分离,升级版本时无需重新打包配置文件。

  • 利用环境变量覆盖:在西西云控制台配置环境变量,如DATABASE_URL,Spring Boot原生支持环境变量优先于配置文件,敏感信息零落地磁盘

  • 多环境Profile管理:使用application-dev.properties、application-test.properties对应不同云端环境,通过启动参数--spring.profiles.active=prod切换,避免手动改配置的运维事故

生产环境的最佳实践路径

综合以上分析,生产环境properties读取应遵循如下决策路径

  • 优先使用Spring Boot的@ConfigurationProperties,配合IDE自动补全和编译期校验

  • 纯Java项目使用自研PropertiesLoader静态加载,兼顾性能与可维护性
  • 所有配置文件统一UTF-8编码,避免跨平台乱码
  • 使用配置中心统一管理,如Apollo或Nacos,实现配置动态刷新
  • 日志中禁止打印配置明文,防止敏感信息泄露
  • 相关问答模块

    properties文件读取时中文乱码,如何彻底解决?

    答:乱码的根本原因是properties文件默认按ISO-8859-1编码解析,彻底解决方法是创建文件时明确保存为UTF-8格式,并在读取时使用InputStreamReader包装并指定StandardCharsets.UTF_8,Maven项目应在pom.xml中设置project.build.sourceEncoding为UTF-8,规避编译期转码。

    配置文件中的数据库密码如何安全保护?

    答:生产环境的数据库密码不能明文存放在properties文件中,推荐方案是使用Spring Boot的Jasypt框架,对密码进行加密后放入配置,设置环境变量JASYPT_ENCRYPTOR_PASSWORD作为解密密钥,密钥只配置在服务器的环境变量中,不进代码仓库,实现配置文件的保密性和可移植性,若使用西西云部署,可直接利用云平台提供的密钥管理服务,进一步降低泄露风险。


    是properties文件读取从原理到实战的全方位解析。欢迎在评论区留言分享你在配置文件读取过程中遇到的问题和经验,我们共同探讨更优的解决方案,如果本文对你有帮助,也可以转发给更多需要的开发者。

0