Выдает исключение, когда свойство дублируется в файле свойств.

Как я могу выдать исключение, если файл свойств содержит повторяющееся свойство? Вот пример, демонстрирующий эту ситуацию:

# Properties-file

directory=D:\\media\\D-Downloads\\Errorfile\\TEST_A
directory=D:\\media\\D-Downloads\\Errorfile\\TEST_B
#directory=D:\\media\\D-Downloads\\Errorfile\\TEST_C

3 ответа

Решение

Я полагаю, вы читаете файл с чем-то вроде Properties.load(), Он устанавливает параметр внутренне, используя put(key, value), Вы можете переопределить этот метод, чтобы получить желаемое поведение, например, например,

new Properties() {
    @Override
    public synchronized Object put(Object key, Object value) {
        if (get(key) != null) {
            throw new IllegalArgumentException(key + " already present.");
        }
        return super.put(key, value);
    }
}.load(...);

РЕДАКТИРОВАТЬ:

Интеграция этого в код ОП:

File propertiesFile = new File("D:/media/myProperties.properties");
Properties properties = new Properties() {
    @Override
    public synchronized Object put(Object key, Object value) {
        if (get(key) != null) {
            // or some other RuntimeException you like better...
            throw new IllegalArgumentException(key + " already present.");
        }
        return super.put(key, value);
    }
}
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(propertiesFile))) {
  properties.load(bis);

} catch (IllegalArgumentException ex) {
  //
}

Кстати, почему вы хотите поймать исключение? Я бы не стал продолжать программу, если ее конфигурация повреждена (возможно, перехват на верхнем уровне для регистрации события). Но обработка исключений - это другая тема...

(РЕДАКТИРОВАТЬ: мои исходные коды кода не компилировались, я их исправил)

Как упоминалось здесь, инструмент для поиска повторяющихся ключей и значений в файле свойств

"Есть два хороших инструмента, которые я использую

unival npm package: это инструмент командной строки для обнаружения повторяющихся ключей, значений или строк.

Команда npm для установки пакета: npm i unival

Ссылка: https://www.npmjs.com/package/unival

unival extension: если вы используете vscode, это чрезвычайно полезное расширение для обнаружения дубликатов на лету. "

Лучший способ - запустить тест для запуска unival-команды, это предотвратит попадание повторяющихся значений в файл свойств.

Ответ Ральфа Клеберхофа правильный; однако я бы не стал использовать анонимный класс. Вполне вероятно, что вы хотите использовать эту функцию более одного раза, поэтому я бы создал класс, который расширяет Properties и переопределить put как и Ральф

Обратите внимание, что метод put взят из Hashtable класс который Properties продолжается.

Вот пример (я не пытался его скомпилировать):

public class UniqueProperties
extends
    Properties
{
    @Override
    public synchronized String put(String key, String value)
    {
        if (get(key) != null)
        {
            throw new IllegalArgumentException(key + " already present.");
        }

        super.put(key, value);
    }
}

Вот как я загружаю свойства:

        File propertiesFile = new File("D:/media/myProperties.properties");
    Properties properties = new Properties();
    try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(propertiesFile))) {
      properties.load(bis);

    } catch (Exception ex) {
      //
    }

@Ralf Как я могу адаптировать ваш код?

Другие вопросы по тегам