Что такое хороший метод сохранения свойств приложения? - PullRequest
7 голосов
/ 29 июля 2010

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

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

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

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

Ответы [ 8 ]

4 голосов
/ 29 июля 2010

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

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

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

4 голосов
/ 29 июля 2010

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

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

2 голосов
/ 29 июля 2010

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

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

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

1 голос
/ 29 июля 2010

Я использую этот код, и он работает довольно хорошо для меня (только частичный код, кодирование из памяти ..): (Это используется в сочетании с классом свойств 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 голос
/ 29 июля 2010

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

0 голосов
/ 29 июля 2010

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

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

0 голосов
/ 29 июля 2010

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

0 голосов
/ 29 июля 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...