2013-06-09 2 views
25

Я использую метод java.util.Properties (Writer, String) для хранения свойств. В результирующем текстовом файле свойства хранятся в случайном порядке.Как написать свойства Java в определенном порядке?

Это то, что я делаю:

Properties properties = createProperties(); 
properties.store(new FileWriter(file), null); 

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

Я надеюсь на решение проще, чем «вручную создать файл свойств».

+8

Может это [ответ] (http://stackoverflow.com/a/54454/1163607) помочь? – NINCOMPOOP

+1

Именно то, что рекомендовал Новый Идиот. Просто переопределите 'public synchronized Enumeration keys()' вместо 'keySet()'. – AlexR

+1

Тем не менее, это не касается случая с заказом _insertion_. – fge

ответ

51

В соответствии с предложением «Новый Идиот» это хранится в алфавитном порядке.

Properties tmp = new Properties() { 
    @Override 
    public synchronized Enumeration<Object> keys() { 
     return Collections.enumeration(new TreeSet<Object>(super.keySet())); 
    } 
}; 
tmp.putAll(properties); 
tmp.store(new FileWriter(file), null); 
+1

Он будет сортировать верхний регистр, затем нижний регистр – Artem

+0

Я бы предпочел ответ от Etienne Studer, потому что, если вы хотите иметь порядок вставки, вы не можете достичь этого на этом пути, потому что внутри он уже использует HashTable. В этом случае LinkedHashTable или LinkedHashSet не будут иметь никакого эффекта. – karate

8

См https://github.com/etiennestuder/java-ordered-properties для полной реализации, что позволяет считывать свойства/записи файлов в хорошо определенном порядке.

OrderedProperties properties = new OrderedProperties(); 
properties.load(new FileInputStream(new File("~/some.properties"))); 
+0

Вы проверили, что вы храните в файле? У меня такое ощущение, что карта, которую вы использовали для пользовательских свойств, вообще не связана с файлом, и вы храните в файле HashTable по умолчанию, извините, если я ошибаюсь. – karate

+0

Это тестовое покрытие: https://github.com/etiennestuder/java-ordered-properties/blob/master/src/test/groovy/nu/studer/java/util/OrderedPropertiesTest.groovy –

+0

Да, я вижу, спасибо для ответа я пытался использовать это в Android, но на самом деле java Properties имеет другую реализацию на Android, поэтому вам нужно переопределить метод entrySet(), чтобы он работал. – karate

1

Решение от Steve McLeod не работает при попытке сортировать регистр без учета регистра.

Это то, что я придумал

Properties newProperties = new Properties() { 

    private static final long serialVersionUID = 4112578634029874840L; 

    @Override 
    public synchronized Enumeration<Object> keys() { 
     Comparator<Object> byCaseInsensitiveString = Comparator.comparing(Object::toString, 
         String.CASE_INSENSITIVE_ORDER); 

     Supplier<TreeSet<Object>> supplier =() -> new TreeSet<>(byCaseInsensitiveString); 

     TreeSet<Object> sortedSet = super.keySet().stream() 
         .collect(Collectors.toCollection(supplier)); 

     return Collections.enumeration(sortedSet); 
    } 
}; 

    // propertyMap is a simple LinkedHashMap<String,String> 
    newProperties.putAll(propertyMap); 
    File file = new File(filepath); 
    try (FileOutputStream fileOutputStream = new FileOutputStream(file, false)) { 
     newProperties.store(fileOutputStream, null); 
    } 
Смежные вопросы