load先加载后读取,store先设值后写入;中文配置须用reader/writer指定utf-8编码;properties是内存对象,无自动同步,修改后需手动store且外部变更需重新load。

load 是读配置,store 是写配置——方向相反,时机关键,顺序不能颠倒。
load:先流后读,否则读不到
load 方法把外部配置数据“装进” Properties 对象,但必须先完成加载动作,后续 getProperty 才能拿到值。常见错误是调用 getProperty 在 load 之前,结果返回 null,而代码不报错,极难排查。
- 必须先调用 p.load(input),再调用 p.getProperty("key")
- 推荐用 try-with-resources 管理流,避免手动 close 遗漏
- 含中文时优先用 Reader(如 FileReader),避免 ISO-8859-1 编码乱码;纯英文可用 InputStream(如 FileInputStream)
store:先设值后写,否则文件空
store 方法把 Properties 对象里的键值对“倒出来”保存到文件,但前提是键值对已存在。如果 store 调用在 setProperty 之前,文件会生成(含时间戳和注释),但实际内容为空或只有默认头信息。
- 必须先调用 p.setProperty("k", "v") 或批量 putAll,再调用 p.store(output, comment)
- store 的 comments 参数非必需,但建议填写简要说明,便于维护
- 写入含中文时同样推荐用 Writer(如 FileWriter),保证编码一致
格式与编码要注意
Properties 文件是纯文本,按行解析,键值对用 = 或 : 分隔,# 或 ! 开头为注释。所有内容默认按 ISO-8859-1 解析,所以中文必须用 Reader/Writer + 正确字符集(如 UTF-8)配合,否则出现乱码或读取失败。
- 保存时若用 FileWriter,可指定编码:new OutputStreamWriter(new FileOutputStream("x.properties"), "UTF-8")
- 读取时同理,避免用 FileInputStream 直接读中文配置
- 重复 key 会被后出现的覆盖,无警告
它们不是“连接”,而是单次搬运
load 和 store 都是一次性操作,不维持流的长期关联。Properties 本身是内存中的 Hashtable 子类,IO 只是临时进出通道。不要把它理解成数据库连接——没有自动同步、没有缓存刷新机制。
- 修改值后需再次 store 才能落盘
- 文件被外部修改后,Properties 对象不会自动更新,必须重新 load
- 没有 reload 方法,如需刷新,只能新建对象再 load










