Gibt es eine Möglichkeit die Reihenfolge mit der Properties#store die Werte in die Datei schreibt zu beeinflussen? Es würde mir schon reichen wenn ich die Werte alphabetisch aufsteigend sortiert hätte.
public void store(Writer writer, String comments)
throws IOException
{
store0((writer instanceof BufferedWriter)?(BufferedWriter)writer
: new BufferedWriter(writer),
comments,
false);
}
public void store(OutputStream out, String comments)
throws IOException
{
store0(new BufferedWriter(new OutputStreamWriter(out, "8859_1")),
comments,
true);
}
private void store0(BufferedWriter bw, String comments, boolean escUnicode)
throws IOException
{
if (comments != null) {
writeComments(bw, comments);
}
bw.write("#" + new Date().toString());
bw.newLine();
synchronized (this) {
for (Enumeration e = keys(); e.hasMoreElements();) {
String key = (String)e.nextElement();
String val = (String)get(key);
key = saveConvert(key, true, escUnicode);
/* No need to escape embedded and trailing spaces for value, hence
* pass false to flag.
*/
val = saveConvert(val, false, escUnicode);
bw.write(key + "=" + val);
bw.newLine();
}
}
bw.flush();
}
public synchronized void loadFromXML(InputStream in)
throws IOException, InvalidPropertiesFormatException
{
if (in == null)
throw new NullPointerException();
XMLUtils.load(this, in);
in.close();
}
/*
* Converts unicodes to encoded \uxxxx and escapes
* special characters with a preceding slash
*/
private String saveConvert(String theString,
boolean escapeSpace,
boolean escapeUnicode) {
int len = theString.length();
int bufLen = len * 2;
if (bufLen < 0) {
bufLen = Integer.MAX_VALUE;
}
StringBuffer outBuffer = new StringBuffer(bufLen);
for(int x=0; x<len; x++) {
char aChar = theString.charAt(x);
// Handle common case first, selecting largest block that
// avoids the specials below
if ((aChar > 61) && (aChar < 127)) {
if (aChar == '\\') {
outBuffer.append('\\'); outBuffer.append('\\');
continue;
}
outBuffer.append(aChar);
continue;
}
switch(aChar) {
case ' ':
if (x == 0 || escapeSpace)
outBuffer.append('\\');
outBuffer.append(' ');
break;
case '\t':outBuffer.append('\\'); outBuffer.append('t');
break;
case '\n':outBuffer.append('\\'); outBuffer.append('n');
break;
case '\r':outBuffer.append('\\'); outBuffer.append('r');
break;
case '\f':outBuffer.append('\\'); outBuffer.append('f');
break;
case '=': // Fall through
case ':': // Fall through
case '#': // Fall through
case '!':
outBuffer.append('\\'); outBuffer.append(aChar);
break;
default:
if (((aChar < 0x0020) || (aChar > 0x007e)) & escapeUnicode ) {
outBuffer.append('\\');
outBuffer.append('u');
outBuffer.append(toHex((aChar >> 12) & 0xF));
outBuffer.append(toHex((aChar >> 8) & 0xF));
outBuffer.append(toHex((aChar >> 4) & 0xF));
outBuffer.append(toHex( aChar & 0xF));
} else {
outBuffer.append(aChar);
}
}
}
return outBuffer.toString();
}
Danke für deine Tipps. Hab es nach dem zitierten Vorschlag gelöst.SlaterB hat gesagt.:schreibst dir eine komplett neue Properties-Klasse, die auf einer SortedMap aufbaut
Das halte ich für ziemlichen Schweinkram. Die Funktionalität einer überschriebenen Methode sollte sich bezüglich Ihrer geerbten Spezifikation nicht ändern. Wenn Deine Properties-Klasse irgendwo anders verwendet wird wo niemand weiß, dass sie ein anderes Format schreibt, dann fliegt der gehörig auf die Nase!Danke für deine Tipps. Hab es nach dem zitierten Vorschlag gelöst.
Whoops, das hatte ich im Kontext einfach angenommen und nicht genau genug geguckt.die Klasse wurde doch gar nicht überschrieben, sondern eine neue erstellt, darf man eine eigene Klasse nicht Properties nennen, wenn man sich nicht genau so verhält wie java.util.Properties?
Hauptsächlich bezog ich mich dabei auf: [Highlight=Java]writer.write(array.replaceAll("\n","<br>"));[/Highlight]Properties.store() gibt nicht vor, dass die Speicherreihenfolge zufällig und auf keinen Fall alphabetisch sein muss, insofern kein Widerspruch,
falls du es nicht mit anderen Eigenschaften wie "Characters less than \u0020 and characters greater than \u007E are written as \uxxxx for the appropriate hexadecimal value xxxx." so genau nimmst