Java如何读取yml文件呢?

欢喜 Java经验 发布时间:2025-08-12 09:37:10 阅读数:6606 1
下文笔者讲述java代码读取yml文件的方法及示例分享,如下所示

java读取yml文件的实现思路

Java读取YAML文件主要方式
 ✅SnakeYAML:
  -轻量级,功能完整
  -支持映射到Java对象
  -适合简单项目

 ✅Spring Boot:
  -自动配置,开箱即用
  -强大的类型安全
  -适合Spring项目

 ✅最佳实践:
  -添加适当的错误处理
  -使用try-with-resources管理资源
  -验证YAML文件格式
  -合理设计配置类结构

方式1:使用SnakeYAML库读取

 添加依赖 
<!-- Maven依赖 -->
<dependency>
    <groupId>org.yaml</groupId>
    <artifactId>snakeyaml</artifactId>
    <version>2.0</version>
</dependency>

基础读取方式

import org.yaml.snakeyaml.Yaml;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Map;

public class YamlReader {
    
    // 读取YAML文件为Map
    public static Map<String, Object> readYamlAsMap(String filePath) {
        try {
            InputStream inputStream = new FileInputStream(filePath);
            Yaml yaml = new Yaml();
            return yaml.load(inputStream);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
    
    // 从classpath读取
    public static Map<String, Object> readYamlFromClasspath(String fileName) {
        try {
            InputStream inputStream = YamlReader.class.getClassLoader()
                    .getResourceAsStream(fileName);
            Yaml yaml = new Yaml();
            return yaml.load(inputStream);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
    
    public static void main(String[] args) {
        // 示例YAML内容:
        // server:
        //   port: 8080
        //   host: localhost
        // database:
        //   url: jdbc:mysql://localhost:3306/test
        //   username: root
        //   password: password
        
        Map<String, Object> yamlData = readYamlAsMap("config.yml");
        if (yamlData != null) {
            System.out.println(yamlData);
            
            // 访问嵌套数据
            Map<String, Object> server = (Map<String, Object>) yamlData.get("server");
            System.out.println("Server Port: " + server.get("port"));
            System.out.println("Server Host: " + server.get("host"));
        }
    }
}

2.映射到Java对象

 定义配置类 
// Server配置类
public class ServerConfig {
    private int port;
    private String host;
    private String contextPath;
    
    // 构造函数
    public ServerConfig() {}
    
    // Getter和Setter
    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; }
    
    public String getContextPath() { return contextPath; }
    public void setContextPath(String contextPath) { this.contextPath = contextPath; }
    
    @Override
    public String toString() {
        return "ServerConfig{" +
                "port=" + port +
                ", host='" + host + '\'' +
                ", contextPath='" + contextPath + '\'' +
                '}';
    }
}

//数据库配置类
public class DatabaseConfig {
    private String url;
    private String username;
    private String password;
    private int maxPoolSize;
    
    public DatabaseConfig() {}
    
    // Getter和Setter
    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; }
    
    public int getMaxPoolSize() { return maxPoolSize; }
    public void setMaxPoolSize(int maxPoolSize) { this.maxPoolSize = maxPoolSize; }
    
    @Override
    public String toString() {
        return "DatabaseConfig{" +
                "url='" + url + '\'' +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", maxPoolSize=" + maxPoolSize +
                '}';
    }
}

//主配置类
public class AppConfig {
    private ServerConfig server;
    private DatabaseConfig database;
    private list<String> profiles;
    
    public AppConfig() {}
    
    // Getter和Setter
    public ServerConfig getServer() { return server; }
    public void setServer(ServerConfig server) { this.server = server; }
    
    public DatabaseConfig getDatabase() { return database; }
    public void setDatabase(DatabaseConfig database) { this.database = database; }
    
    public List<String> getProfiles() { return profiles; }
    public void setProfiles(List<String> profiles) { this.profiles = profiles; }
    
    @Override
    public String toString() {
        return "AppConfig{" +
                "server=" + server +
                ", database=" + database +
                ", profiles=" + profiles +
                '}';
    }
}
 
读取并映射到对象

import org.yaml.snakeyaml.Yaml;
import org.yaml.snakeyaml.constructor.Constructor;
import java.io.InputStream;

public class YamlToObjectMapper {
    
    //直接映射到对象
    public static <T> T readYamlAsObject(String fileName, Class<T> clazz) {
        try {
            InputStream inputStream = YamlToObjectMapper.class.getClassLoader()
                    .getResourceAsStream(fileName);
            Yaml yaml = new Yaml(new Constructor(clazz));
            return yaml.load(inputStream);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
    
    //使用类型描述符
    public static AppConfig readAppConfig(String fileName) {
        try {
            InputStream inputStream = YamlToObjectMapper.class.getClassLoader()
                    .getResourceAsStream(fileName);
            Yaml yaml = new Yaml();
            return yaml.loadAs(inputStream, AppConfig.class);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
    
    public static void main(String[] args) {
        // 示例YAML文件内容 (application.yml):
        // server:
        //   port: 8080
        //   host: localhost
        //   context-path: /api
        // database:
        //   url: jdbc:mysql://localhost:3306/test
        //   username: root
        //   password: password
        //   max-pool-size: 20
        // profiles:
        //   - dev
        //   - test
        
        AppConfig config = readAppConfig("application.yml");
        if (config != null) {
            System.out.println(config);
            System.out.println("Server Port: " + config.getServer().getPort());
            System.out.println("Database URL: " + config.getDatabase().getUrl());
            System.out.println("Profiles: " + config.getProfiles());
        }
    }
}

3.使用Spring Boot(推荐)

 添加Spring Boot依赖
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <version>3.1.0</version>
</dependency>

配置类定义

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.List;

@Component
@ConfigurationProperties(prefix = "app")
public class ApplicationProperties {
    private Server server = new Server();
    private Database database = new Database();
    private List<String> profiles;
    
    // Server内部类
    public static class Server {
        private int port = 8080;
        private String host = "localhost";
        private String contextPath = "/";
        
        // Getter和Setter
        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; }
        
        public String getContextPath() { return contextPath; }
        public void setContextPath(String contextPath) { this.contextPath = contextPath; }
    }
    
    // Database内部类
    public static class Database {
        private String url;
        private String username;
        private String password;
        private int maxPoolSize = 10;
        
        // Getter和Setter
        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; }
        
        public int getMaxPoolSize() { return maxPoolSize; }
        public void setMaxPoolSize(int maxPoolSize) { this.maxPoolSize = maxPoolSize; }
    }
    
    // 主类的Getter和Setter
    public Server getServer() { return server; }
    public void setServer(Server server) { this.server = server; }
    
    public Database getDatabase() { return database; }
    public void setDatabase(Database database) { this.database = database; }
    
    public List<String> getProfiles() { return profiles; }
    public void setProfiles(List<String> profiles) { this.profiles = profiles; }
}


使用配置

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.commandlinerunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class YamlApplication implements CommandLineRunner {
    
    @Autowired
    private ApplicationProperties properties;
    
    public static void main(String[] args) {
        SpringApplication.run(YamlApplication.class, args);
    }
    
    @Override
    public void run(String... args) throws Exception {
        System.out.println("Server Port: " + properties.getServer().getPort());
        System.out.println("Database URL: " + properties.getDatabase().getUrl());
        System.out.println("Profiles: " + properties.getProfiles());
    }
}


application.yml配置文件
app:
  server:
    port: 8080
    host: localhost
    context-path: /api
  database:
    url: jdbc:mysql://localhost:3306/test
    username: root
    password: password
    max-pool-size: 20
  profiles:
    - dev
    - test
    - prod

4.高级用法

 处理复杂数据结构
import org.yaml.snakeyaml.Yaml;
import java.util.;

public class ComplexYamlReader {
    
    // 读取复杂YAML结构
    public static void readComplexYaml() {
        String yamlContent = """
            application:
              name: MyApp
              version: 1.0.0
              environments:
                development:
                  debug: true
                  log-level: DEBUG
                  databases:
                    - name: primary
                      url: jdbc:h2:mem:testdb
                      pool-size: 5
                    - name: secondary
                      url: jdbc:h2:mem:seconddb
                      pool-size: 3
                production:
                  debug: false
                  log-level: WARN
                  databases:
                    - name: primary
                      url: jdbc:mysql://prod-server:3306/appdb
                      pool-size: 20
            """;
        
        Yaml yaml = new Yaml();
        Map<String, Object> data = yaml.load(yamlContent);
        
        // 解析复杂结构
        Map<String, Object> app = (Map<String, Object>) data.get("application");
        System.out.println("Application Name: " + app.get("name"));
        
        Map<String, Object> environments = (Map<String, Object>) app.get("environments");
        Map<String, Object> devEnv = (Map<String, Object>) environments.get("development");
        
        System.out.println("Dev Debug: " + devEnv.get("debug"));
        
        List<Map<String, Object>> databases = (List<Map<String, Object>>) devEnv.get("databases");
        for (Map<String, Object> db : databases) {
            System.out.println("DB Name: " + db.get("name"));
            System.out.println("DB URL: " + db.get("url"));
        }
    }
}

YAML读取工具类简介

import org.yaml.snakeyaml.Yaml;
import org.yaml.snakeyaml.constructor.Constructor;
import java.io.;
import java.util.Map;

public class YamlUtils {
    
    // 安全读取YAML文件
    public static <T> T safeLoadYaml(String filePath, Class<T> clazz) {
        try (InputStream inputStream = new FileInputStream(filePath)) {
            Yaml yaml = new Yaml(new Constructor(clazz));
            return yaml.load(inputStream);
        } catch (FileNotFoundException e) {
            System.err.println("YAML文件未找到: " + filePath);
            return null;
        } catch (Exception e) {
            System.err.println("解析YAML文件出错: " + e.getMessage());
            return null;
        }
    }
    
    // 从classpath安全读取
    public static <T> T safeLoadYamlFromClasspath(String fileName, Class<T> clazz) {
        try (InputStream inputStream = YamlUtils.class.getClassLoader()
                .getResourceAsStream(fileName)) {
            
            if (inputStream == null) {
                System.err.println("Classpath中未找到文件: " + fileName);
                return null;
            }
            
            Yaml yaml = new Yaml(new Constructor(clazz));
            return yaml.load(inputStream);
        } catch (Exception e) {
            System.err.println("解析YAML文件出错: " + e.getMessage());
            return null;
        }
    }
    
    // 验证YAML内容
    public static boolean validateYaml(String filePath) {
        try (InputStream inputStream = new FileInputStream(filePath)) {
            Yaml yaml = new Yaml();
            yaml.load(inputStream);
            return true;
        } catch (Exception e) {
            System.err.println("YAML文件验证失败: " + e.getMessage());
            return false;
        }
    }
}
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaJingYan/202508/17549626678511.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者