2011-05-31 7 views
22

¿Es posible forzar Properties para no agregar el comentario de la fecha al frente? Me refiero a algo así como la primera línea aquí:Properties.store() - suprimir el sello de tiempo Comentario

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

Me gustaría deshacerme de él por completo. Necesito que mis archivos de configuración sean idénticos a los diff a menos que haya un cambio significativo .

Respuesta

10

Dado el código fuente o las propiedades, no, no es posible. Por cierto, dado que Properties es en realidad una tabla hash y dado que sus claves no están ordenadas, no puede confiar en que las propiedades estén siempre en el mismo orden.

Utilizaría un algoritmo personalizado para almacenar las propiedades si tuviera este requisito. Use el código fuente de Propiedades como iniciador.

+1

¿El hecho de que 'String.hashCode()' no está bien definido y estable implica que el orden de las entradas en la tabla hash es consistente? –

+0

+1 - sin clasificar: buena captura. Tuvo este problema antes y realmente abandonó las Propiedades a "una colección de líneas" (una lista), las ordenó alfabéticamente y vació la colección en un archivo. –

+1

@Konrad: el mismo conjunto de propiedades (claves) siempre se imprimirá en el mismo orden, pero si agrega una, el archivo de propiedades podría mezclarse ... al menos no hay garantía de que las otras claves mantengan su orden. –

9

Supongo que no. Esta marca de tiempo se imprime en private method on Properties y no hay ninguna propiedad para controlar ese comportamiento.

única idea que viene a la mente: Properties subclase, sobrescribir store y copiar/pegar el contenido del método store0 de manera que no se imprimirá la fecha de comentario.

O - proporcionar una costumbre BufferedWriter que imprime toda pero la primera línea (que se producirá un error si se agrega comentarios reales, ya que los comentarios personalizados se imprimen antes de la fecha y hora ...)

+0

que tenía que hacer lo que usted sugiere. Subclase Propiedades para poder tener un ordenamiento coherente y sin marca de tiempo. No es lo mejor que hacer, copiar pegando el código fuente del método privado es desagradable. Pero es la única forma que encontré. –

0
No se puede

se simplemente marque su aplicación en algún lugar cuando se produzca un cambio de configuración significativo y solo escriba el archivo si está configurado.

Es posible que desee mirar en Commons Configuration que tiene un poco más de flexibilidad a la hora de escribir y leer cosas como archivos de propiedades. En particular, tiene métodos que intentan escribir exactamente el mismo archivo de propiedades (incluyendo espaciado, comentarios, etc.) como el archivo de propiedades existente.

4

Basado en https://stackoverflow.com/a/6184414/242042 aquí está la implementación que he escrito que quita la primera línea y ordena las claves.

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

limpieza se parece a esto

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, ""); 
    } 
Cuestiones relacionadas