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, "");
}
¿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? –
+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. –
@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. –