本文目录导读:

在Java中读取YML配置文件有多种方式,以下是几种常见的方法:
使用SnakeYAML(最基础的方式)
Maven依赖
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
<version>2.2</version>
</dependency>
示例代码
import org.yaml.snakeyaml.Yaml;
import java.io.*;
import java.util.Map;
public class YamlReader {
public static void main(String[] args) {
Yaml yaml = new Yaml();
try (InputStream inputStream = new FileInputStream("config.yml")) {
// 读取为Map
Map<String, Object> config = yaml.load(inputStream);
// 获取配置项
String name = (String) config.get("name");
Map<String, Object> database = (Map<String, Object>) config.get("database");
System.out.println("Name: " + name);
System.out.println("Database URL: " + database.get("url"));
} catch (IOException e) {
e.printStackTrace();
}
}
}
config.yml示例
name: myapp database: url: jdbc:mysql://localhost:3306/mydb username: root password: secret server: port: 8080 host: 0.0.0.0
使用Jackson(推荐方式)
Maven依赖
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-yaml</artifactId>
<version>2.16.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.16.0</version>
</dependency>
读取为Map
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import java.io.File;
import java.util.Map;
public class JacksonYamlReader {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
// 读取为Map
Map<String, Object> config = mapper.readValue(
new File("config.yml"),
Map.class
);
System.out.println(config);
}
}
读取为Java对象(推荐)
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import java.io.File;
public class JacksonObjectReader {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
AppConfig config = mapper.readValue(
new File("config.yml"),
AppConfig.class
);
System.out.println("Name: " + config.getName());
System.out.println("Port: " + config.getServer().getPort());
}
}
// 对应的Java Bean
class AppConfig {
private String name;
private DatabaseConfig database;
private ServerConfig server;
// getters and setters
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public DatabaseConfig getDatabase() { return database; }
public void setDatabase(DatabaseConfig database) { this.database = database; }
public ServerConfig getServer() { return server; }
public void setServer(ServerConfig server) { this.server = server; }
}
class DatabaseConfig {
private String url;
private String username;
private String password;
// getters and setters
public String getUrl() { return url; }
public void setUrl(String url) { this.url = url; }
public String getUsername() { return username; }
public void setUsername(String username) { this.username = username; }
public String getPassword() { return password; }
public void setPassword(String password) { this.password = password; }
}
class ServerConfig {
private int port;
private String host;
// getters and setters
public int getPort() { return port; }
public void setPort(int port) { this.port = port; }
public String getHost() { return host; }
public void setHost(String host) { this.host = host; }
}
Spring Boot方式
如果在Spring Boot项目中,可以直接使用@ConfigurationProperties:
application.yml
app:
name: myapp
database:
url: jdbc:mysql://localhost:3306/mydb
username: root
password: secret
server:
port: 8080
host: 0.0.0.0
Java配置类
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.Map;
@Component
@ConfigurationProperties(prefix = "app")
public class AppConfig {
private String name;
private DatabaseConfig database;
private ServerConfig server;
// getters and setters
}
class DatabaseConfig {
private String url;
private String username;
private String password;
// getters and setters
}
class ServerConfig {
private int port;
private String host;
// getters and setters
}
使用方式
@Service
public class AppService {
@Autowired
private AppConfig appConfig;
public void printConfig() {
System.out.println(appConfig.getName());
System.out.println(appConfig.getDatabase().getUrl());
}
}
资源文件读取(classpath下的yml)
import org.yaml.snakeyaml.Yaml;
import java.io.InputStream;
import java.util.Map;
public class ClasspathYamlReader {
public static void main(String[] args) {
Yaml yaml = new Yaml();
// 从classpath读取
try (InputStream inputStream =
ClasspathYamlReader.class
.getClassLoader()
.getResourceAsStream("config.yml")) {
if (inputStream != null) {
Map<String, Object> config = yaml.load(inputStream);
System.out.println(config);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
选择建议
- 简单项目:使用SnakeYAML
- 需要对象映射:使用Jackson(推荐)
- Spring Boot项目:使用@ConfigurationProperties(最方便)
Jackson方式既能处理简单配置,也能进行复杂对象映射,是大多数项目的最佳选择。