Java:从项目文件夹下的文件加载数据失败

时间:2016-10-24 11:52:02

标签: java yaml snakeyaml

我正在尝试使用org.yaml.snake读取.yaml文件(位于我的项目文件夹下,位于同一个包下的java文件下)图书馆。

我的java源文件如下:

sample.java

private void readAndLoadFromConfigFile() {
        Yaml yaml = new Yaml();
        InputStream inputStream = null;
        try {
            inputStream = getClass().getResourceAsStream("config.yaml");
            @SuppressWarnings("unchecked")
            Map<String, Map<String, String>> values = (Map<String, Map<String, String>>) yaml.load(inputStream);
            for (String key : values.keySet()) {
                Map<String, String> subValues = values.get(key);
                logger.info(key);

                for (String subValueKey : subValues.keySet()) {
                    logger.info(String.format("\t%s = %s", subValueKey, subValues.get(subValueKey)));
                }
            }

            inputStream.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

config.yaml 是:

ip_addresses:
firstMachineAddress : '162.242.195.82'
secondMachineAddress : '50.31.209.229'
ports:
firstTargetPort : '4041'
secondTargetPort : '5051'

但是我得到“流关闭”异常。有人能发现问题吗?

编辑:我添加了@SuppressWarnings("unchecked"),现在又说file not found,这是一个不同的问题。我怀疑错误是一个路径问题,它无法找到我的config.yaml

任何人都可以了解如何引用项目文件夹下的文件?

1 个答案:

答案 0 :(得分:2)

你需要正确的道路。

getClass().getResourceAsStream("...")加载相对于当前类所在路径的文件(因为您使用该类来查询资源)。因此,如果您的类位于名为com.example.mypackage的包中,并且您提供了字符串"config.yaml",则该文件将相对于类'包文件夹进行搜索。

由于您使用maven,放置文件的正确方法是src/main/resources/com/example/mypackage/config.yaml。但是,如果您希望将yaml文件直接放在src/main/resources中,则必须使用绝对路径"/config.yaml"绝对您的JAR的上下文,即)。

或者,可能更干净,使用类加载器来查询相对路径:

getClass().getClassLoader().getResourceAsStream("config.yaml");

这将与src/main/resources中的config.yaml一起使用。