Wie kann ich das Gleichheitszeichen ( =
) in Java-Eigenschaftendateien umgehen? Ich möchte Folgendes in meine Datei aufnehmen:
table.whereclause=where id=100
Antworten:
Weitere Informationen finden Sie in der Methode zum Laden (Reader Reader) aus der Property
Klasse auf Javadoc
In der load(Reader reader)
Methodendokumentation heißt es
Der Schlüssel enthält alle Zeichen in der Zeile mit den ersten nicht-weißen Leerzeichen beginnen und bis zu, aber nicht einschließlich, die erste unescaped
'='
,':'
oder Raumzeichen andere als ein Leitungsabschluss. Alle diese Schlüsselabschlusszeichen können in den Schlüssel aufgenommen werden, indem sie mit einem vorhergehenden Backslash-Zeichen maskiert werden. beispielsweise,\:\=
wäre die zweistellige Taste
":=".
Zeilenabschlusszeichen können mit\r
und\n
Escape-Sequenzen eingefügt werden. Alle Leerzeichen nach dem Überspringen des Schlüssels; Wenn das erste nicht Leerzeichen nach dem Schlüssel'='
oder ist':'
, wird es ignoriert und alle Leerzeichen nach dem Schlüssel werden ebenfalls übersprungen. Alle verbleibenden Zeichen in der Zeile werden Teil der zugehörigen Elementzeichenfolge. Wenn keine verbleibenden Zeichen vorhanden sind, ist das Element die leere Zeichenfolge""
. Sobald die rohen Zeichenfolgen, aus denen der Schlüssel und das Element bestehen, identifiziert sind, wird die Escape-Verarbeitung wie oben beschrieben durchgeführt.
Hoffentlich hilft das.
In Ihrem speziellen Beispiel müssen Sie nicht den Gleichen entkommen - Sie müssen nur entkommen, wenn es Teil des Schlüssels ist. Das Eigenschaftendateiformat behandelt alle Zeichen nach dem ersten nicht entkoppelten Gleichheitszeichen als Teil des Werts.
Das Standard-Escapezeichen in Java ist '\'.
Die Java-Eigenschaftendatei hat jedoch das Format key = value. Sie sollte alles nach dem ersten Wert als Wert berücksichtigen.
Der beste Weg, um diese Art von Problemen zu vermeiden, besteht darin, Eigenschaften programmgesteuert zu erstellen und sie dann zu speichern. Verwenden Sie beispielsweise folgenden Code:
java.util.Properties props = new java.util.Properties();
props.setProperty("table.whereclause", "where id=100");
props.store(System.out, null);
Dies würde in System.out die ordnungsgemäß maskierte Version ausgeben.
In meinem Fall war die Ausgabe:
#Mon Aug 12 13:50:56 EEST 2013
table.whereclause=where id\=100
Wie Sie sehen, ist dies eine einfache Möglichkeit, Inhalte von .properties-Dateien zu generieren, die garantiert korrekt sind. Und Sie können so viele Eigenschaften platzieren, wie Sie möchten.
In meinem Fall funktionieren zwei führende '\\' gut für mich.
Beispiel: Wenn Ihr Wort das Zeichen '#' enthält (z. B. aa # 100, können Sie es mit zwei führenden '\\' maskieren.
key= aa\\#100
Sie können hier nachsehen. Kann der Schlüssel in einer Java-Eigenschaft ein Leerzeichen enthalten?
für Flucht gleich '=' \ u003d
table.whereclause = wobei id = 100
Schlüssel: [table.whereclause] Wert: [wobei id = 100]
table.whereclause \ u003dwhere id = 100
Schlüssel: [table.whereclause = where] Wert: [id = 100]
table.whereclause \ u003dwhere \ u0020id \ u003d100
Schlüssel: [table.whereclause = wobei id = 100] Wert: []
Diese Methode soll dazu beitragen, programmgesteuert Werte zu generieren, die garantiert 100% kompatibel mit .properties
Dateien sind:
public static String escapePropertyValue(final String value) {
if (value == null) {
return null;
}
try (final StringWriter writer = new StringWriter()) {
final Properties properties = new Properties();
properties.put("escaped", value);
properties.store(writer, null);
writer.flush();
final String stringifiedProperties = writer.toString();
final Pattern pattern = Pattern.compile("(.*?)escaped=(.*?)" + Pattern.quote(System.lineSeparator()) + "*");
final Matcher matcher = pattern.matcher(stringifiedProperties);
if (matcher.find() && matcher.groupCount() <= 2) {
return matcher.group(matcher.groupCount());
}
// This should never happen unless the internal implementation of Properties::store changed
throw new IllegalStateException("Could not escape property value");
} catch (final IOException ex) {
// This should never happen. IOException is only because the interface demands it
throw new IllegalStateException("Could not escape property value", ex);
}
}
Sie können es so nennen:
final String escapedPath = escapePropertyValue("C:\\Users\\X");
writeToFile(escapedPath); // will pass "C\\:\\\\Users\\\\X"
Diese Methode ist etwas teuer, aber das Schreiben von Eigenschaften in eine Datei ist normalerweise ohnehin eine sporadische Operation.
Ich konnte Werte innerhalb des Zeichens eingeben ":
db_user="postgresql"
db_passwd="this,is,my,password"