Как записать java.util. Свойства к XML с отсортированными ключами?

Я думаю, что вы пропустите, как получить все файлы в этом каталоге. Для этого используйте модуль glob. Вот пример, который будет дублировать все файлы с расширением * .txt в файлы с расширением * .out

import glob

list_of_files = glob.glob('./*.txt')           # create the list of file
for file_name in list_of_files:
  FI = open(file_name, 'r')
  FO = open(file_name.replace('txt', 'out'), 'w') 
  for line in FI:
    FO.write(line)

  FI.close()
  FO.close()
13
задан erickson 5 November 2008 в 19:09
поделиться

8 ответов

Вот быстрый и грязный способ сделать это:

String propFile = "/path/to/file";
Properties props = new Properties();

/* Set some properties here */

Properties tmp = new Properties() {
  @Override
  public Set<Object> keySet() {
    return Collections.unmodifiableSet(new TreeSet<Object>(super.keySet()));
  }
};

tmp.putAll(props);

try {
    FileOutputStream xmlStream = new FileOutputStream(propFile);
    /* This comes out SORTED! */
    tmp.storeToXML(xmlStream,"");
} catch (IOException e) {
    e.printStackTrace();
}

Вот протесты:

  • tmp Свойства (анонимный подкласс) не выполняет контракт Свойств.

, Например, если бы Вы получили keySet и попытались удалить элемент из него, исключение было бы повышено. Так, не позволяйте экземплярам этого подкласса выходить! В отрывке выше, Вы никогда не передаете его другому объекту или возвращаете его вызывающей стороне, у которой есть законное ожидание, что это выполняет контракт Свойств, таким образом, это безопасно.

  • реализация Properties.storeToXML могла измениться, заставив это проигнорировать метод набора ключей.

, Например, будущий выпуск или OpenJDK, мог использовать keys() метод Hashtable вместо keySet. Это - одна из причин, почему классы должны всегда документировать свое "самоиспользование" (Эффективный Объект Java 15). Однако в этом случае худшее, которое произошло бы, - то, что Ваш вывод вернулся бы к неотсортированному.

  • Помнят, что методы устройства хранения данных Свойств игнорируют любые записи "по умолчанию".
27
ответ дан 1 December 2019 в 17:28
поделиться

Вы могли отсортировать ключи сначала, затем цикл через объекты в файле свойств и записать им в XML-файл.

public static void main(String[] args){
        String propFile = "/tmp/test2.xml";
        Properties props = new Properties();
        props.setProperty("key", "value");
        props.setProperty("key1", "value1");
        props.setProperty("key2", "value2");
        props.setProperty("key3", "value3");
        props.setProperty("key4", "value4");

        try {
            BufferedWriter out = new BufferedWriter(new FileWriter(propFile));
            List<String> list = new ArrayList<String>();
            for(Object o : props.keySet()){
                list.add((String)o);
            }
            Collections.sort(list);
            out.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
            out.write("<!DOCTYPE properties SYSTEM \"http://java.sun.com/dtd/properties.dtd\">\n");
            out.write("<properties>\n");
            out.write("<comment/>\n");
            for(String s : list){
                out.write("<entry key=\"" + s + "\">" + props.getProperty(s) + "</entry>\n");
            }
            out.write("</properties>\n");
            out.flush();
            out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
3
ответ дан 1 December 2019 в 17:28
поделиться

Самый простой взлом должен был бы переопределить набор ключей. Определенный взлом, и не гарантируемый работать в будущих внедрениях:

new Properties() {
    @Override Set<Object> keySet() {
        return new TreeSet<Object>(super.keySet());
    }
}

(Правовая оговорка: Я даже не протестировал это, это компилирует.)

, С другой стороны, Вы могли использовать что-то как XSLT для переформатирования произведенного XML.

4
ответ дан 1 December 2019 в 17:28
поделиться

java.util. Свойства основаны на Хеш-таблице, которая не хранит ее значения в алфавитном порядке, но в порядке хеша каждого объекта, именно поэтому Вы видите поведение, которое Вы.

1
ответ дан 1 December 2019 в 17:28
поделиться

java.util. Свойства являются подклассом java.util. Хеш-таблица . ('Хеш', будучи ключом здесь.) необходимо было бы придумать собственную потребительскую реализацию на основе чего-то, что сохраняет/определяет порядок... как TreeMap.

1
ответ дан 1 December 2019 в 17:28
поделиться

Вы могли попробовать это:

Делают новый класс, который делает что java.util. XMLUtils делает, но в сохранении метод изменяет это:

Set keys = props.keySet();
Iterator i = keys.iterator();

к

Set keys = props.keySet();
List<String> newKeys = new ArrayList<String>();
for(Object key : keys)
{
   newKeys.add(key.toString());
}
Collections.sort(newKeys);
Iterator i = newKeys.iterator();

свойства Extend и переопределение класс Свойств storeToXML метод для вызова метода сохранения нового класса.

0
ответ дан 1 December 2019 в 17:28
поделиться

Почему Вы хотите, чтобы XML-файл был отсортирован во-первых? По-видимому, существует другая часть кода, который читает файл и помещает данные в другой объект Свойств. Вы хотите сделать это так, можно ли вручную найти и отредактировать ли записи в XML-файле?

-2
ответ дан 1 December 2019 в 17:28
поделиться

Вот способ создания отсортированного вывода для хранилища Properties.store (OutputStream out, строковые комментарии) и Properties.storeToXML (OutputStream os, строковый комментарий) :

Properties props = new Properties() {
    @Override
    public Set<Object> keySet(){
        return Collections.unmodifiableSet(new TreeSet<Object>(super.keySet()));
    }

    @Override
    public synchronized Enumeration<Object> keys() {
        return Collections.enumeration(new TreeSet<Object>(super.keySet()));
    }
};
props.put("B", "Should come second");
props.put("A", "Should come first");
props.storeToXML(new FileOutputStream(new File("sortedProps.xml")), null);
props.store(new FileOutputStream(new File("sortedProps.properties")), null);
20
ответ дан 1 December 2019 в 17:28
поделиться
Другие вопросы по тегам:

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