Java案例怎么读取配置文件?6种实战方法全攻略
目录导读
- 为什么读取配置文件是Java开发的必修课?
- Java读取配置文件的6种核心方法
- 1 Properties类读取.properties文件
- 2 ResourceBundle类读取国际化配置
- 3 使用YAML配置文件与SnakeYAML库
- 4 Spring框架的@Value与@ConfigurationProperties
- 5 环境变量与系统属性的混合读取策略
- 6 用json-simple读取JSON格式配置
- 实战案例:从文件路径到类路径的最佳实践
- 常见问题解答(FAQ)
为什么读取配置文件是Java开发的必修课?
在Java企业级开发中,配置文件是连接代码与环境的关键桥梁,无论是数据库连接串、第三方API密钥,还是业务规则开关,硬编码这些值都会让应用变得僵化、不安全,通过读取配置文件,你可以实现:

- 环境隔离:开发、测试、生产环境绑定不同的配置文件
- 动态调整:修改配置无需重新编译代码
- 安全性提升:敏感信息(如密码)可加密后存储在配置中
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。
解决方案:
- 内部配置:Spring Boot自动加载classpath下的
application.yaml - 外部配置:通过
@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环境验证。