Wie entkommt man dem Doppelpunkt (:) in der Eigenschaftendatei?

Lesezeit: 4 Minuten

Benutzer-Avatar
indiws

Ich verwende eine Eigenschaftendatei, um die Konfigurationswerte meiner Anwendung zu speichern. In einem der Fälle muss ich einen Wert als speichern
xxx:yyy:zzz. Wenn ich das tue, wird der Doppelpunkt mit einem Backslash maskiert\ was dazu führt, dass der Wert als angezeigt wird xxx\:yyy\:zzz in der Eigenschaftsdatei.

Ich bin mir bewusst, dass der Doppelpunkt : ist ein Standardtrennzeichen der Properties Java-Klasse. Allerdings muss ich den Wert noch ohne den Backslash speichern \.

Irgendwelche Vorschläge, wie man damit umgeht?

  • Ich fürchte, das können Sie nicht. Wie könnten die Eigenschaftsdateien andernfalls zurückgelesen werden, ohne “Ihre” Doppelpunkte und Doppelpunkte zu verwechseln, die zum Trennen von Schlüsselwerten verwendet werden?

    – ewernli

    22. Mai 2012 um 9:20 Uhr

  • Erstellen Sie einen StringWriter, schreiben Sie Ihre Eigenschaftendatei hinein, gehen Sie Zeile für Zeile durch den Puffer und suchen Sie nach "\:"und ersetzen Sie es durch ein einzelnes ":". Das ist nicht schön, aber andererseits ist das, was Sie zu tun versuchen, auch nicht sehr schön.

    – Sergej Kalinitschenko

    22. Mai 2012 um 9:29 Uhr

  • @BhavikAmbani ‘Verwenden Sie dafür reguläre Ausdrücke’ wie? Wo genau haben Sie die Möglichkeit, beim Speichern einer Eigenschaftendatei einen regulären Ausdruck anzugeben, und wie genau würde das RE aussehen?

    – Benutzer207421

    22. Mai 2012 um 10:06 Uhr

Benutzer-Avatar
Stefan C

Tragen Sie die Eigenschaften in die ein Properties Objekt und speichern Sie es mit a store(...) Methode. Die Methode führt alle erforderlichen Escapezeichen aus. Das Java-Dokumentation sagt:

“… Für den Schlüssel werden alle Leerzeichen mit einem vorangestellten \-Zeichen geschrieben. Für das Element werden führende Leerzeichen, aber keine eingebetteten oder abschließenden Leerzeichen, mit einem vorangestellten \-Zeichen geschrieben. Die Schlüssel- und Elementzeichen #, !, = und : werden mit einem vorangestellten Backslash geschrieben, um sicherzustellen, dass sie richtig geladen werden.”

Sie müssen Zeichen nur dann manuell maskieren, wenn Sie die Datei von Hand erstellen / schreiben.


Umgekehrt, wenn Sie möchten, dass die Datei Doppelpunkte ohne Escapezeichen enthält, haben Sie Pech. Eine solche Datei ist fehlerhaft und wird wahrscheinlich nicht richtig geladen, wenn Sie die verwenden Properties.load(...) Methoden. Wenn Sie diesen Weg einschlagen, müssen Sie Ihre eigenen benutzerdefinierten Lade- und/oder Speichermethoden implementieren.

Benutzer-Avatar
Patrick Kiernan

Ich bin auf das gleiche Problem gestoßen. Schrägstriche / auch durch die entkommen store() Methode ein Properties.

Ich habe dieses Problem gelöst, indem ich meine eigene erstellt habe CustomProperties Klasse (erweitern java.util.Properties) und den Aufruf auskommentieren saveConvert() in dem customStore0() Methode.

Hier ist mein CustomProperties Klasse:

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.util.Date;
import java.util.Enumeration;
import java.util.Properties;

public class CustomProperties extends Properties {
  private static final long serialVersionUID = 1L;
  @Override
  public void store(OutputStream out, String comments) throws IOException {
      customStore0(new BufferedWriter(new OutputStreamWriter(out, "8859_1")),
                   comments, true);
  }
  //Override to stop "https://stackoverflow.com/" or ':' chars from being replaced by not called 
  //saveConvert(key, true, escUnicode)
  private void customStore0(BufferedWriter bw, String comments, boolean escUnicode)
          throws IOException {
      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);
              // Commented out to stop "https://stackoverflow.com/" or ':' chars being replaced
              //key = saveConvert(key, true, escUnicode);
              //val = saveConvert(val, false, escUnicode);
              bw.write(key + "=" + val);
              bw.newLine();
          }
      }
      bw.flush();
  }
}

  • Hallo, mein Problem hier ist, dass Java beim Speichern einer Eigenschaft den Eigenschaftswert interpretiert und wenn es zum Beispiel Folgendes findet: ‘\n’ macht es einen Zeilenumbruch und speichert eine neue Eigenschaft, sodass das Ergebnis 2 Eigenschaften anstelle von einer ist. eine Idee, es zu beheben?

    – Despoten

    17. Februar um 14:12 Uhr

Benutzer-Avatar
David Patterson

Auf diese Frage sind wir vor ein paar Tagen gestoßen. Wir haben vorhandene Eigenschaftendateien mit URLs als Werten manipuliert.

Es ist riskant, aber wenn Ihre Eigenschaftswerte weniger als 40 Zeichen lang sind, können Sie die Methode “list” anstelle von “store” verwenden:

http://docs.oracle.com/javase/6/docs/api/java/util/Properties.html#list(java.io.PrintWriter)

Wir haben uns den JDK-Code kurz angesehen und eine benutzerdefinierte Implementierung des Speichers gehackt, die für unsere Zwecke funktioniert:

public void store(Properties props, String propertyFilePath) throws FileNotFoundException {
    PrintWriter pw = new PrintWriter(propertyFilePath); 
    for (Enumeration e = props.propertyNames(); e.hasMoreElements();) {
        String key = (String) e.nextElement();
        pw.println(key + "=" + props.getProperty(key));
    }
    pw.close();
}

Wenn Sie die xml-Variante der Eigenschaftendatei verwenden (mithilfe von loadFromXML und storeToXML) sollte kein Problem sein.

Benutzer-Avatar
jspek

Versuchen Sie es mit Unicode.

Der Unicode für einen Doppelpunkt ist\u003A

Zusätzlich lautet der Unicode für ein Leerzeichen: \u0020

Eine Liste der lateinischen Grundzeichen finden Sie unter: https://en.wikipedia.org/wiki/Basic_Latin_(Unicode_block)

Zum Beispiel:

ProperName\u003A\NameContinues=Some property value

Wird eine Eigenschaft mit einem Schlüssel erwarten:

ProperName:NameContinues

Und hat einen Wert von:

Some property value

Benutzer-Avatar
Omadschide

Bei mir hat es mit der Verwendung funktioniert \ vor Sonderzeichen,

z.B,

Before: VCS\u003aIC\u0020Server\u003a=Migration
After: VCS\:IC\ Server\:=Migration

: ist mit entkommen \: und (Leerzeichen) mit \ (\ gefolgt von ).

Für mehr Information : https://en.wikipedia.org/wiki/.properties

Benutzer-Avatar
Wim Deblauwe

Für Leute wie mich, die hierher kommen, wenn sie Spring Boot-Konfigurationseigenschaftendateien verwenden: Sie müssen einschließen [..]:

Z.B:

my.test\:key=value

ist nicht genug, Sie brauchen dies in Ihrem application.properties zum Beispiel:

my.[test\:key]=value

Siehe auch SpringBoot2 ConfigurationProperties entfernt Doppelpunkt aus Yaml-Schlüsseln

1014730cookie-checkWie entkommt man dem Doppelpunkt (:) in der Eigenschaftendatei?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy