Java: разбор файлов .yaml [с использованием змеи.yaml, если возможно]

Я пытаюсь загрузить данные из файла .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);
    }

но это тоже не сработало. Я получаю сообщение об ошибке «Поток закрыт», и он ничего не загружает.

Кто знает, кто решит эту проблему?

P.S.: Мне сказали использовать библиотеку змеи-yaml, и я не могу скачать никакую другую, если это имеет значение.


person Schütze    schedule 27.10.2016    source источник


Ответы (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/.

то есть для com.abc.def.MyClass.getClass().getClassLoader().getResourceAsStream() файл должен находиться в той же папке, что и /com.

Изменить

С косой чертой в начале строки ресурса это было бы так же, как использование getClassLoader(). Итак, в вашем случае config.yaml должен быть найден на верхнем уровне пути к классам.

person KC Wong    schedule 27.10.2016
comment
Разве в Java нет способа получить доступ к документу, который находится в папке проекта, а не в каком-либо пакете? - person Schütze; 27.10.2016
comment
Во время выполнения Java не имеет концепции папки проекта; все методы .getResource() работают на основе ClassLoader и путей к классам. Вы можете либо использовать Class.getResource() с относительным путем к вызывающему классу, либо использовать ClassLoader.getResource() с путем относительно classpath. - person KC Wong; 27.10.2016