Java读取properties文件最轻量方式是Properties类,但默认ISO-8859-1编码致中文乱码;应使用load(Reader)配合UTF-8 InputStreamReader;classpath下需用ClassLoader.getResourceAsStream();getProperty()无法区分未配置与空值;不支持YAML/JSON。

Java 里读取配置文件最常用、最轻量的方式就是用 java.util.Properties 类,它专为 key-value 形式的 .properties 文件设计,无需额外依赖,但要注意它默认只支持 ISO-8859-1 编码,中文会乱码。
Properties.load() 为什么读中文会乱码
因为 Properties.load(InputStream) 方法底层按 ISO-8859-1 解码字节流,而 UTF-8 编码的中文字符(如 name=张三)会被错误解析。即使文件本身保存为 UTF-8,只要走这个方法,就会出问题。
- 解决办法:改用
Properties.load(Reader),配合InputStreamReader指定 UTF-8 - 不要用
new FileReader(file)—— 它不接受编码参数,平台默认编码不可控 - 如果必须用
load(InputStream),就得提前把文件转成 ISO-8859-1(比如用 native2ascii 工具),不推荐
如何安全加载 classpath 下的 application.properties
多数项目把配置放在 src/main/resources/ 下,运行时在 classpath 根路径。要用 ClassLoader.getResourceAsStream() 获取流,避免硬编码路径或文件不存在异常。
Properties props = new Properties();
try (InputStream is = MyClass.class.getClassLoader().getResourceAsStream("application.properties")) {
if (is == null) {
throw new IllegalArgumentException("application.properties not found in classpath");
}
props.load(new InputStreamReader(is, StandardCharsets.UTF_8));
} catch (IOException e) {
throw new RuntimeException(e);
}
Properties.getProperty() 的默认值和空字符串陷阱
getProperty(String key) 返回 null 表示 key 不存在;getProperty(String key, String defaultValue) 在 key 不存在时才返回默认值——但若配置中写的是 url=(空值),它仍会返回空字符串 "",不是 null,也不是默认值。
启明星企业抽奖程序 系统采用ASP.NET4.0 无需数据库。在企业抽奖时,请勿关闭或者刷新页面。因为系统目前没有提供保存数据功能。例如在抽二等奖和一等奖之间,可能有时间间隔。那么,此时,你可以按F11取消全屏,然后最小化页面,再单击右下角喇叭,设置无声。1.启明星抽奖程序配置说明使用说明:在lottery/lottery文件夹下,有3个文本文件。company.txt存放公司名称,award.t
立即学习“Java免费学习笔记(深入)”;
- 检查是否为空值,得用
StringUtils.isBlank(props.getProperty("url"))(Apache Commons)或手动判空 - 不要依赖
getProperty(key) == null判断配置是否存在,它无法区分“未配置”和“配置为空” - 敏感字段(如密码)建议加前缀校验,例如
props.getProperty("db.password", "").trim().isEmpty()
Properties 不能直接读取 YAML 或 JSON 配置
Properties 类只认 key=value 格式,对缩进、列表、嵌套一概不支持。如果你看到 application.yml 或 config.json,Properties.load() 会抛 IllegalArgumentException 或静默失败(部分键值被截断)。
- YAML 请用 SnakeYAML、Jackson YAML 或 Spring Boot 的
YamlPropertySourceLoader - JSON 推荐 Jackson 的
ObjectMapper+Map反序列化,再手动转成Properties(如有必要) - 强行用
Properties解析非 .properties 文件,等于放弃格式语义,后期维护成本陡增
真正麻烦的不是怎么读,而是怎么让不同环境(dev/test/prod)的配置不互相污染,以及怎么让空值、注释、多行值这些边界情况不出错——这些 Properties 本身不处理,得靠约定或封装。









