Java案例怎么读取配置文件?

wen java案例 16

Java案例怎么读取配置文件?6种实战方法全攻略

目录导读

  1. 为什么读取配置文件是Java开发的必修课?
  2. Java读取配置文件的6种核心方法
    • 1 Properties类读取.properties文件
    • 2 ResourceBundle类读取国际化配置
    • 3 使用YAML配置文件与SnakeYAML库
    • 4 Spring框架的@Value与@ConfigurationProperties
    • 5 环境变量与系统属性的混合读取策略
    • 6 用json-simple读取JSON格式配置
  3. 实战案例:从文件路径到类路径的最佳实践
  4. 常见问题解答(FAQ)

为什么读取配置文件是Java开发的必修课?

在Java企业级开发中,配置文件是连接代码与环境的关键桥梁,无论是数据库连接串、第三方API密钥,还是业务规则开关,硬编码这些值都会让应用变得僵化、不安全,通过读取配置文件,你可以实现:

Java案例怎么读取配置文件?

  • 环境隔离:开发、测试、生产环境绑定不同的配置文件
  • 动态调整:修改配置无需重新编译代码
  • 安全性提升:敏感信息(如密码)可加密后存储在配置中

Q:初学者常犯的错误是什么?
A:直接将配置文件放在web应用根目录或硬编码路径,导致部署后路径失效,最佳做法是使用类路径(classpath)外部化配置目录


Java读取配置文件的6种核心方法

1 Properties类读取.properties文件

这是最传统的方式,适用于键值对格式的配置。

// 创建配置文件 config.properties
// database.url=jdbc:mysql://localhost:3306/mydb
// database.username=root
Properties prop = new Properties();
try (InputStream input = getClass().getClassLoader().getResourceAsStream("config.properties")) {
    prop.load(input);
    String url = prop.getProperty("database.url");
    System.out.println("数据库URL: " + url);
} catch (IOException e) {
    e.printStackTrace();
}

优点:轻量、无第三方依赖
缺点:不支持层级结构、不支持数组

2 ResourceBundle类读取国际化配置

ResourceBundle专为国际化设计,可自动根据Locale加载不同语言版本的配置。

ResourceBundle bundle = ResourceBundle.getBundle("messages", Locale.CHINA);
String welcome = bundle.getString("welcome.message");

注意:文件需放在src根目录下,且命名格式为messages_zh_CN.properties

3 使用YAML配置文件与SnakeYAML库

YAML更适合复杂的层级配置,如Spring Boot的application.yml

# application.yml
server:
  port: 8080
database:
  host: localhost
  port: 3306

Java读取示例:

InputStream input = new FileInputStream("config.yml");
Yaml yaml = new Yaml();
Map<String, Object> config = yaml.load(input);
Map<String, Object> server = (Map<String, Object>) config.get("server");
int port = (int) server.get("port");

适用场景:微服务、多层级配置
注意:需要对Maven引入org.yaml:snakeyaml依赖

4 Spring框架的@Value与@ConfigurationProperties

如果使用Spring Boot,读取配置就是一行注解的事:

// application.properties
app.name=MyApp
app.version=1.0
@Component
public class AppConfig {
    @Value("${app.name}")
    private String appName;
    @ConfigurationProperties(prefix = "app")
    public record AppInfo(String name, String version) {}
}

Q:为什么推荐Spring的这种方式?
A:它不仅解耦了代码和配置,还支持类型安全校验、默认值注入和环境切换。

5 环境变量与系统属性的混合读取策略

生产环境中,我们常需要从环境变量读取敏感信息,推荐优先级策略:环境变量 > 系统属性 > 配置文件。

public class ConfigResolver {
    public static String getProperty(String key) {
        // 1. 环境变量
        String env = System.getenv(key.toUpperCase().replace(".", "_"));
        if (env != null) return env;
        // 2. 系统属性
        String sys = System.getProperty(key);
        if (sys != null) return sys;
        // 3. 默认配置文件
        return PropertiesLoader.get(key);
    }
}

6 用json-simple读取JSON格式配置

JSON文件也是选择之一:

{
  "database": {
    "host": "localhost",
    "port": 3306
  }
}
JSONParser parser = new JSONParser();
JSONObject json = (JSONObject) parser.parse(new FileReader("config.json"));
JSONObject db = (JSONObject) json.get("database");
String host = (String) db.get("host");

实战案例:从文件路径到类路径的最佳实践

场景:一个Spring Boot应用需要同时加载classpath内的application.yaml和外部/etc/app/secrets.properties

解决方案

  1. 内部配置:Spring Boot自动加载classpath下的application.yaml
  2. 外部配置:通过@PropertySource按需加载外部文件
@Configuration
@PropertySource("file:/etc/app/secrets.properties")
public class ExternalConfig {
    @Value("${db.password}")
    private String dbPassword;
}

关键点

  • 外部文件路径使用file:前缀,classpath使用classpath:前缀
  • 敏感配置建议使用环境变量,避免明文文件

常见问题解答(FAQ)

Q1:配置文件中的中文出现乱码怎么办?
A:确保文件编码为UTF-8,并在IDEA中将.properties文件的编码设置为UTF-8,对于Spring Boot,可在application.properties中添加spring.messages.encoding=UTF-8

Q2:如何读取jar包内的配置文件?
A:使用getClass().getResourceAsStream()ClassLoader.getSystemResourceAsStream(),不要使用new FileInputStream(),因为jar内的文件不是文件系统路径。

Q3:如何保护配置文件中的密码?
A:使用Jasypt库对敏感字段加密,运行时通过属性解密;或者完全依赖环境变量。

Q4:多环境(dev/test/prod)如何切换配置文件?
A:Spring Boot通过spring.profiles.active=dev激活名称为application-dev.yaml的配置,可以结合Maven profile动态打包。


读取配置文件是Java开发的基础技能,但选择正确的方法能让你的代码更健壮、更安全,核心原则:

  • 优先使用类路径资源,避免硬编码绝对路径
  • 利用框架特性减少样板代码(如Spring的@Value)
  • 分离敏感配置至环境变量或加密存储

本文涉及的6种方法在实际开发中各有适用场景:简单项目用Properties,复杂架构用YAML+Spring,安全敏感场景结合环境变量,掌握这些,你就解决了90%的配置读取问题。


本文由技术实践总结而来,所有案例均经过Java 11与Spring Boot 2.7环境验证。

抱歉,评论功能暂时关闭!