Propriété.store () - supprimer le commentaire de timestamp

Est-il possible de forcer Properties ne pas ajouter le commentaire de la date au début? Je veux dire quelque chose comme la première ligne ici:

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

je tiens à vous en débarrasser complètement. J'ai besoin que mes fichiers de configuration soient diff-identiques sauf s'il y a un significatives modifier.

24
demandé sur Konrad Garus 2011-05-31 11:34:10
la source

5 ответов

étant donné le code source ou les propriétés, non, ce n'est pas possible. BTW, puisque les propriétés sont en fait une table de hachage et puisque ses clés ne sont donc pas triées, vous ne pouvez pas compter sur les propriétés pour être toujours dans le même ordre de toute façon.

j'utiliserais un algorithme personnalisé pour stocker les propriétés si j'avais cette exigence. Utilisez le code source des propriétés comme démarreur.

10
répondu JB Nizet 2011-05-31 11:43:07
la source
https://stackoverflow.com/a/6184414/242042 Voici l'implémentation que j'ai écrite qui enlève la première ligne et trie les clés.

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);
    }
}

le nettoyage ressemble à ceci

    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, "");
    }
5
répondu Archimedes Trajano 2017-05-23 15:10:03
la source

ne pouvez-vous pas simplement signaler dans votre application quelque part quand un changement de configuration significatif a lieu et n'écrire le fichier que si celui-ci est défini?

Vous voudrez peut-être regarder dans Configuration Commons qui a un peu plus de flexibilité quand il s'agit d'écrire et de lire des choses comme des fichiers de propriétés. En particulier, il a des méthodes qui tentent d'écrire exactement le même fichier de propriétés (y compris l'espacement, commentaires, etc) que le fichier de propriétés.

0
répondu 2011-05-31 11:43:00
la source

si vous essayez de modifier dans le xxx.fichier conf, il sera utile.

la méthode write utilisée pour sauter la première ligne (#Thu May 26 09:43:52 CEST 2011) dans la méthode store. La méthode d'écriture exécuter jusqu'à la fin de la première ligne. après il fonctionnera normalement.

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') {
                // Used to go to next line if did use this line
                // you will get the continues output from the give file
                super.write('\n');

                firstlineseen = true;
            }
        }

    }


    private static final long serialVersionUID = 7567765340218227372L;

    @Override
    public synchronized Enumeration<java.lang.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);
    }
}
0
répondu Sathis Kumaran M 2018-05-29 17:12:35
la source

Autres questions sur