我正在尝试从 .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/