Java:解析 .yaml 文件 [如果可能,使用 snake.yaml]
Java: Parsing .yaml files [using snake.yaml if possible]
我正在尝试从一个 .yaml
文件中加载数据,我在其中保存了两台机器的 IP 地址和端口。我的.yaml
文件如下:
config.yaml
ip_addresses :
firstMachineAddress : '162.242.195.82'
secondMachineAddress : '50.31.209.229'
ports :
firstTargetPort : '4041'
secondTargetPort : '5051'
我把它放在项目文件夹下(不在与 class 相同的包中),我想从那里加载。但是,到目前为止我尝试的任何方法都没有用。
最后,我将配置文件放在 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。要验证,您应该尝试从 InputStream ios 打印数据。您也可以致电
URL url = getClass().getResource('/config.yaml');
并打印 url 以查看路径 Java returns。
当您调用 class.getResource() 时,预计会在与 class 相同的包中找到该文件。如果 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 应该位于 class 路径的顶层。
我正在尝试从一个 .yaml
文件中加载数据,我在其中保存了两台机器的 IP 地址和端口。我的.yaml
文件如下:
config.yaml
ip_addresses :
firstMachineAddress : '162.242.195.82'
secondMachineAddress : '50.31.209.229'
ports :
firstTargetPort : '4041'
secondTargetPort : '5051'
我把它放在项目文件夹下(不在与 class 相同的包中),我想从那里加载。但是,到目前为止我尝试的任何方法都没有用。
最后,我将配置文件放在 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。要验证,您应该尝试从 InputStream ios 打印数据。您也可以致电
URL url = getClass().getResource('/config.yaml');
并打印 url 以查看路径 Java returns。
当您调用 class.getResource() 时,预计会在与 class 相同的包中找到该文件。如果 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 应该位于 class 路径的顶层。