Свойства .store() - подавить комментарий временной метки
Можно ли заставить Properties
не добавлять комментарий даты раньше? Я имею в виду что-то вроде первой строки здесь:
#Thu May 26 09:43:52 CEST 2011
main=pkg.ClientMain
args=myargs
Я хотел бы полностью избавиться от него. Мне нужно, чтобы мои файлы конфигурации были идентичны друг другу, если не произошло значимых изменений.
Ответы
Ответ 1
Учитывая исходный код или свойства, нет, это невозможно. BTW, так как Properties на самом деле является хеш-таблицей, и поскольку его ключи, таким образом, не отсортированы, вы не можете полагаться на свойства, которые всегда будут в одном порядке.
Я бы использовал собственный алгоритм для хранения свойств, если бы у меня было это требование. Используйте исходный код свойств в качестве стартера.
Ответ 2
Не думаю. Эта временная метка напечатана в приватном методе Properties
, и для управления этим поведением нет никакого свойства.
Только идея, которая приходит мне на ум: подкласс Properties
, перезаписать store
и скопировать/вставить содержимое метода store0
, чтобы комментарий даты не печатался.
Или - предоставить пользовательский BufferedWriter
, который печатает все, кроме первой строки (что не удастся, если вы добавите реальные комментарии, поскольку пользовательские комментарии печатаются до отметки времени...)
Ответ 3
Основываясь на fooobar.com/questions/234184/..., вот реализация, которую я написал, которая вырезает первую строку и сортирует ключи.
public class CleanProperties extends Properties {
private static class StripFirstLineStream extends FilterOutputStream {
private boolean firstlineseen = false;
public StripFirstLineStream(final OutputStream out) {
super(out);
}
@Override
public void write(final int b) throws IOException {
if (firstlineseen) {
super.write(b);
} else if (b == '\n') {
firstlineseen = true;
}
}
}
private static final long serialVersionUID = 7567765340218227372L;
@Override
public synchronized Enumeration<Object> keys() {
return Collections.enumeration(new TreeSet<>(super.keySet()));
}
@Override
public void store(final OutputStream out, final String comments) throws IOException {
super.store(new StripFirstLineStream(out), null);
}
}
Очистка выглядит следующим образом
final Properties props = new CleanProperties();
try (final Reader inStream = Files.newBufferedReader(file, Charset.forName("ISO-8859-1"))) {
props.load(inStream);
} catch (final MalformedInputException mie) {
throw new IOException("Malformed on " + file, mie);
}
if (props.isEmpty()) {
Files.delete(file);
return;
}
try (final OutputStream os = Files.newOutputStream(file)) {
props.store(os, "");
}
Ответ 4
Можете ли вы просто не указывать в своем приложении где-нибудь, когда происходит значимое изменение конфигурации, и записывать только файл, если он установлен?
Возможно, вы захотите заглянуть в Commons Configuration, которая имеет немного большую гибкость, когда дело доходит до написания и чтения таких вещей, как файлы свойств. В частности, у него есть методы, которые пытаются записать тот же самый файл свойств (включая интервалы, комментарии и т.д.) В качестве существующего файла свойств.