Подтвердить что ты не робот

Свойства .store() - подавить комментарий временной метки

Можно ли заставить Properties не добавлять комментарий даты раньше? Я имею в виду что-то вроде первой строки здесь:

#Thu May 26 09:43:52 CEST 2011
main=pkg.ClientMain
args=myargs

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

4b9b3361

Ответ 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, которая имеет немного большую гибкость, когда дело доходит до написания и чтения таких вещей, как файлы свойств. В частности, у него есть методы, которые пытаются записать тот же самый файл свойств (включая интервалы, комментарии и т.д.) В качестве существующего файла свойств.