在Java里如何读写配置文件_Java Properties类使用解析

Java中读写配置文件最常用Properties类,它轻量标准、专用于键值对格式,支持加载/保存、需注意UTF-8编码处理中文,线程不安全,简单项目适用。

Java中读写配置文件最常用的方式是使用Properties类,它专为处理键值对格式的文本配置文件(如app.properties)而设计,轻量、标准、无需额外依赖。

Properties的基本用法:加载和保存

Properties本质是一个继承自Hashtable的类,内部以String为键和值。它支持从输入流加载(如文件、类路径资源),也支持写入到输出流。

  • 加载配置:用load(InputStream)读取.properties文件,推荐用ClassLoader.getResourceAsStream()加载类路径下的文件
  • 保存配置:用store(OutputStream, String comments)写入文件,会自动添加时间戳和注释头
  • 注意编码:默认按ISO-8859-1解析,含中文需用load(Reader)配合InputStreamReader指定UTF-8

读取配置的常见方式

从不同位置读取配置时,路径处理很关键:

  • 类路径下(推荐):Properties props = new Properties(); props.load(getClass().getClassLoader().getResourceAsStream("config.properties"));
  • 文件系统绝对路径:new FileInputStream("/etc

    /myapp/config.properties")
  • 相对路径(基于当前工作目录):new FileInputStream("conf/app.properties"),但不建议,易受运行环境影响

读取后用getProperty(String key)获取值,可提供默认值:props.getProperty("timeout", "3000")

写入配置并保留中文与格式

直接用store()写入中文会出现乱码,因为默认编码是ISO-8859-1。正确做法是:

  • store(Writer, String)重载方法,传入UTF-8编码的OutputStreamWriter
  • 示例:try (Writer w = new OutputStreamWriter(new FileOutputStream("config.properties"), StandardCharsets.UTF_8)) { props.store(w, "Updated config"); }
  • 若需保持原有注释或空行,Properties本身不支持——它只保留键值对;复杂格式建议换用Apache Commons Configuration或YAML/JSON库

线程安全与替代方案提醒

Properties的方法不是线程安全的(虽然继承自Hashtable,但load/store等不加锁)。多线程频繁读写配置时:

  • 建议加载后转为不可变副本(如Map.copyOf(props)),运行时只读取
  • 动态更新需求强的场景,考虑Spring Boot的@ConfigurationProperties或第三方库如Typesafe Config
  • 简单项目够用,但不要把它当数据库用——不支持嵌套、数组、类型转换等高级功能