Я думаю, что вы пропустите, как получить все файлы в этом каталоге. Для этого используйте модуль 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()
Вот быстрый и грязный способ сделать это:
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();
}
Вот протесты:
, Например, если бы Вы получили keySet
и попытались удалить элемент из него, исключение было бы повышено. Так, не позволяйте экземплярам этого подкласса выходить! В отрывке выше, Вы никогда не передаете его другому объекту или возвращаете его вызывающей стороне, у которой есть законное ожидание, что это выполняет контракт Свойств, таким образом, это безопасно.
, Например, будущий выпуск или OpenJDK, мог использовать keys()
метод Hashtable
вместо keySet
. Это - одна из причин, почему классы должны всегда документировать свое "самоиспользование" (Эффективный Объект Java 15). Однако в этом случае худшее, которое произошло бы, - то, что Ваш вывод вернулся бы к неотсортированному.
Вы могли отсортировать ключи сначала, затем цикл через объекты в файле свойств и записать им в 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();
}
}
Самый простой взлом должен был бы переопределить набор ключей. Определенный взлом, и не гарантируемый работать в будущих внедрениях:
new Properties() {
@Override Set<Object> keySet() {
return new TreeSet<Object>(super.keySet());
}
}
(Правовая оговорка: Я даже не протестировал это, это компилирует.)
, С другой стороны, Вы могли использовать что-то как XSLT для переформатирования произведенного XML.
java.util. Свойства основаны на Хеш-таблице, которая не хранит ее значения в алфавитном порядке, но в порядке хеша каждого объекта, именно поэтому Вы видите поведение, которое Вы.
java.util. Свойства являются подклассом java.util. Хеш-таблица . ('Хеш', будучи ключом здесь.) необходимо было бы придумать собственную потребительскую реализацию на основе чего-то, что сохраняет/определяет порядок... как TreeMap.
Вы могли попробовать это:
Делают новый класс, который делает что 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 метод для вызова метода сохранения нового класса.
Почему Вы хотите, чтобы XML-файл был отсортирован во-первых? По-видимому, существует другая часть кода, который читает файл и помещает данные в другой объект Свойств. Вы хотите сделать это так, можно ли вручную найти и отредактировать ли записи в XML-файле?
Вот способ создания отсортированного вывода для хранилища 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);