Что такое хороший метод сохранения свойств приложения?

У меня есть серия свойств приложения, которые у всех есть различные типы.

Типы могли включать, булевские переменные, даты, метки времени или строки.

Я должен смочь обеспечить способность к административным пользователям измениться, эти свойства и иметь систему для запоминания / сохраняют их в файл.

Я ищу лучшую практику способ сохранить эти свойства приложения и смочь сохранить их на изменении и загрузить их на запуске.

7
задан JavaRocky 29 July 2010 в 06:00
поделиться

8 ответов

Сообщение из будущего: ссылка уже мертва.

В Java есть средство, созданное специально для этой цели - Свойства. Вот очень хорошая статья об этом

https://docs.oracle.com/javase/tutorial/essential/environment/properties.html

4
ответ дан 6 December 2019 в 21:08
поделиться

Предполагая, что вы используете Java, взгляните на Apache Commons DatabaseConfiguration ( http://commons.apache.org/configuration/apidocs/org/apache/commons/configuration/DatabaseConfiguration .html ).
По сути, то, что он делает, довольно просто. Он сканирует таблицу, содержащую пары ключ-значение, и представляет эту таблицу как java.util.Properties. Вы можете использовать это для загрузки свойств вашего приложения из базы данных.
После загрузки вы можете кэшировать эти свойства в своем приложении. Не забывайте аннулировать этот кеш всякий раз, когда вы вносите изменения в свойства приложения.

1
ответ дан 6 December 2019 в 21:08
поделиться

Поскольку у вас есть потребность в хранении и чтении различных свойств различных типов, таких как логические, целые числа и т. Д., Я считаю, что API java.util.prefs - хороший выбор для тебя. Он позволяет хранить и читать различные типы данных.

Вот документация API

4
ответ дан 6 December 2019 в 21:08
поделиться

Я использую этот код, и он у меня работает неплохо (только частичный код, кодирование из памяти ..): (Он используется вместе с классом свойств java, но упрощает добавление свойств и синхронизацию шаблона файла свойств.)

to use:
Date date = Conf.value(Prop.SOME_DATE,Date.class);

,

enum Prop {
    SOME_DATE(Date.class, "2009-10-28", "Some date"){
        Object parse(String value){
            return new Date(value);
        }};
    private final Class<?> type;
    private final String description;
    private final Object default;
    Properties(Class<?> type, String defaultValue, String desc){
       this.type = type;
       this.description = desc;
       this.default = this.parse(defaultValue);
    }
    abstract Object parse(String value);
}

и

class Conf {
    private static final String PROP_FILE_NAME = "some.properties";
    private volatile Map<Prop,Object> store;

    public void load(){
        //Read from property file and use default if not given.
        //I code it in a way that it will not permit null as value, so 
        //if default is null the user is forced to provide setting.
    }

    public <T> T value(Prop prop, Class<T> clazz){
        return (T)this.store.get(prop);
    }
    public static void main(String[] args){
        //code to autogenerate property file
        //Something like:
        //#Default : 2009-10-28 Description : Some date. Type:Date
        //#SOME_DATE=2009-10-28
    }
}

Аргумент класса делает метод немного многословно, но иногда раздражает, если вы можете позволить java вывести только тип, например:

CountDownLatch latch = Conf.value(Prop.SOME_INTEGER);
//Compilation error! Since it expects int and won't unbox.

CountDownLatch latch = Conf.value(Prop.SOME_ITEGER,Integer.class);
//Verbose, but works everytime. Of course you could get a 
//ClassCastException, but you should notice that early 
//in the development...    
1
ответ дан 6 December 2019 в 21:08
поделиться

Вы можете хранить их в своей базе данных, однако из-за разницы в типах данных ваших свойств вам придется хранить их в их строковом представлении. Вы можете использовать другой столбец, чтобы указать, возможно, тип данных .

Эту форму параметризации приложения вы успешно использовали в моей работе. Это общая идея, я хо pe вы можете прийти к своему решению с этим.

0
ответ дан 6 December 2019 в 21:08
поделиться

java.util.Properties - самый простой способ. Объект Properties может быть создан из файла свойств (файла, содержащего свойства в формате name = value ) или даже из простого файла XML. Вы можете изменить объект в памяти, а затем записать его обратно в файл свойств или XML.

Если вам нужна большая гибкость в структурировании свойств, вы можете подумать о создании собственного XML-файла конфигурации , хотя для чтения и записи потребуется немного больше работы. Однако вы можете использовать API маршалинга / демаршалинга, например JAXB, XStream и т. Д., Чтобы упростить эту задачу.

Эти файлы также можно легко изменить вручную.

2
ответ дан 6 December 2019 в 21:08
поделиться

Вы можете использовать SQLite Firefox использует его для сохранения свойств

0
ответ дан 6 December 2019 в 21:08
поделиться

Несмотря на то, что вы должны использовать Preferences API или Properties, вот хак, который также может сработать:

Создайте HashMap и используйте XMLEncoder/XMLDecoder для сохранения/загрузки. Большинство стандартных классов java могут быть сериализованы таким образом как java beans. Вы можете создать простой класс-обертку для получения различных свойств, обработки значений по умолчанию и т.д. Таким образом можно также хранить вложенные коллекции, что иногда очень удобно. Это очень просто реализовать.

0
ответ дан 6 December 2019 в 21:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: