Java:解析.yaml文件[如果可能的话使用snake.yaml]

时间:2016-10-27 08:14:47

标签: 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库,我不能下载任何其他文件,以防万一。

1 个答案:

答案 0 :(得分:1)

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

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

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

当您调用class.getResource()时,该文件应该与该类在同一个包中找到。如果YAML文件与包结构处于同一级别,则应使用

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

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

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

修改

在资源字符串中使用前导斜杠,它与使用getClassLoader()相同。所以在你的情况下,config.yaml应该在类路径的顶层找到。