java8读取yaml文件内容包括注释
时间: 2024-05-15 21:16:49 浏览: 154
Java本身没有直接读取YAML文件包括注释的API,但可以使用第三方库SnakeYAML实现。
以下是一个示例代码,使用SnakeYAML库读取YAML文件内容包括注释:
```java
import org.yaml.snakeyaml.Yaml;
import org.yaml.snakeyaml.constructor.Constructor;
import org.yaml.snakeyaml.nodes.Node;
import org.yaml.snakeyaml.nodes.Tag;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.LinkedHashMap;
import java.util.Map;
public class YamlReader {
public static void main(String[] args) throws FileNotFoundException {
Yaml yaml = new Yaml(new CommentedConstructor());
InputStream inputStream = new FileInputStream("config.yml");
Map<String, Object> obj = yaml.load(inputStream);
System.out.println(obj);
}
}
class CommentedConstructor extends Constructor {
public CommentedConstructor() {
this.yamlConstructors.put(null, new CommentedConstruct());
}
private class CommentedConstruct extends Constructor.ConstructYamlMap {
@Override
public Object construct(Node node) {
Object obj = super.construct(node);
if (node instanceof org.yaml.snakeyaml.nodes.MappingNode) {
org.yaml.snakeyaml.nodes.MappingNode mnode = (org.yaml.snakeyaml.nodes.MappingNode) node;
Map<String, Object> map = (Map<String, Object>) obj;
for (org.yaml.snakeyaml.nodes.NodeTuple tuple : mnode.getValue()) {
org.yaml.snakeyaml.nodes.Node keyNode = tuple.getKeyNode();
if (keyNode instanceof org.yaml.snakeyaml.nodes.ScalarNode) {
org.yaml.snakeyaml.nodes.ScalarNode scalarNode = (org.yaml.snakeyaml.nodes.ScalarNode) keyNode;
String key = scalarNode.getValue();
map.put(key, tuple.getValueNode().getRawValue());
// 将注释保存到map中
if (tuple.getValueNode().getTag().equals(Tag.COMMENT)) {
map.put("#" + key, tuple.getValueNode().getValue());
}
}
}
}
return obj;
}
}
}
```
这里使用了CommentedConstructor继承自SnakeYAML的Constructor类,重写了构造函数,并在其中对节点进行了处理。使用时只需要将YAML文件的路径修改为自己的文件路径即可。
需要注意的是,这里的注释是以键值对的方式保存在Map中的,键值为"#"+原键名。因此在获取键值对时需要注意。
阅读全文