Java:解析 .yaml 文件 [如果可能,使用 Snake.yaml]

标签 java yaml snakeyaml

我正在尝试从 .yaml 文件加载数据,其中保存了两台计算机的 IP 地址和端口。我的 .yaml 文件如下:

config.yaml

ip_addresses :
firstMachineAddress : '162.242.195.82'
secondMachineAddress : '50.31.209.229'
ports :
firstTargetPort : '4041'
secondTargetPort : '5051'

我将其放在我想要加载的项目文件夹下(与该类不在同一个包中)。然而,到目前为止我所尝试的一切都不起作用。

最后,我将配置文件放在 src/main/resources 下并尝试了以下操作:

private void loadFromFile() throws FileNotFoundException {
        Yaml yaml = new Yaml();
        ArrayList<String> key = new ArrayList<String>();
        ArrayList<String> value = new ArrayList<String>();

        try {
            InputStream ios = getClass().getResourceAsStream("/config.yaml");

            // Parse the YAML file and return the output as a series of Maps and Lists
            Map<String, Object> result = (Map<String, Object>) yaml.load(ios);
            for (Object name : result.keySet()) {

                key.add(name.toString());
                value.add(result.get(name).toString());
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

        System.out.println(key + " : " + value);
    }

但这也不起作用。我收到“Stream Closed”错误,但它没有加载任何内容。

有人知道谁来解决这个问题吗?

P.S.:我被告知要使用 Snake-yaml 库,并且我无法下载任何其他库,以防万一。

最佳答案

这很可能是因为找不到文件 config.yaml。要进行验证,您应该尝试从 ios InputStream 打印数据。您也可以调用

URL url = getClass().getResource('/config.yaml');

并打印 url 以查看 Java 返回的路径。

当您调用 class.getResource() 时,预计会在与该类相同的包中找到该文件。如果 YAML 文件与包结构处于同一级别,那么您应该使用

.getClass().getClassLoader().getResourceAsStream() instead.

即对于 com.abc.def.MyClass.getClass().getResourceAsStream(),该文件应位于/com/abc/def/文件夹中。

即对于 com.abc.def.MyClass.getClass().getClassLoader().getResourceAsStream(),该文件应与/com 位于同一文件夹中。

编辑

在资源字符串中使用前导斜杠,与使用 getClassLoader() 相同。因此,在您的情况下,config.yaml 应该位于类路径的顶层。

关于Java:解析 .yaml 文件 [如果可能,使用 Snake.yaml],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40279501/

相关文章:

java - 使用 SnakeYaml 处理缺失字段

java - 创建配置.yml 文件

java - do-while 循环似乎不起作用 (Java)

java - SecureSocial 库中缺少 securesocial.core.Identity?

java - 目标org.springframework.boot的执行默认值:spring-boot-maven-plugin:1. 4.0.RELEASE:repackage failed: Unable to rename

Azure 管道循环

azure - 是否可以在 Azure Pipelines 模板 yaml 中混合映射参数?如何?

java - 有没有人使用本地 Maven 存储库中的 SnakeYAML 成功加载 YAML 文件?

groovy加载YAML文件修改并将其写入文件中

Java - RunnableFuture 和 SortProcessor