我正在尝试从.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库,我不能下载任何其他文件,以防万一。
答案 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应该在类路径的顶层找到。