Come eseguire l'escape del segno di uguale nei file delle proprietà


85

Come posso sfuggire al segno di uguale ( =) nei file delle proprietà Java? Vorrei inserire qualcosa come il seguente nel mio file:

table.whereclause=where id=100

Risposte:


84

Inoltre, fare riferimento al metodo di caricamento (Reader Reader) dalla Propertyclasse su javadoc

Nella load(Reader reader)documentazione del metodo si dice

La chiave contiene tutti i caratteri nella riga che iniziano con il primo carattere di spazio non vuoto e fino al primo carattere di spazio vuoto o senza caratteri di escape '=', ma non incluso, ':'diverso da un terminatore di riga. Tutti questi caratteri di terminazione chiave possono essere inclusi nella chiave facendo l'escape con un carattere barra rovesciata precedente; per esempio,

\:\=

sarebbe la chiave di due caratteri ":=". I caratteri del terminatore di riga possono essere inclusi utilizzando \red \nescono sequenze. Qualsiasi spazio bianco dopo che la chiave è stata ignorata; se il primo carattere di spazio non vuoto dopo la chiave è '=' o ':', viene ignorato e anche qualsiasi carattere di spazio vuoto dopo di esso viene saltato. Tutti i caratteri rimanenti sulla riga diventano parte della stringa dell'elemento associato; se non ci sono caratteri rimanenti, l'elemento è la stringa vuota "". Una volta identificate le sequenze di caratteri grezzi che costituiscono la chiave e l'elemento, l'elaborazione dell'escape viene eseguita come descritto sopra.

Spero possa aiutare.


92

Nel tuo esempio specifico non è necessario eseguire l'escape degli uguali: devi solo eseguire l'escape se fa parte della chiave. Il formato del file delle proprietà tratterà tutti i caratteri dopo il primo uguale senza caratteri di escape come parte del valore.


12
non so perché questo non è stato contrassegnato! Risposta corretta più semplice! E la maggior parte delle volte le persone cercano valori di escape nel file delle proprietà!
Tejas

1
Piccola correzione: tratterà come valore tutti i caratteri dopo il primo uguale senza caratteri di escape e gli spazi finali, ovvero gli spazi iniziali nel valore vengono eliminati. Esempio "myKey = my value" è uguale a "myKey = my value".
Paulo Merson

25

Il carattere di escape predefinito in Java è "\".
Tuttavia, il file delle proprietà Java ha il formato chiave = valore, dovrebbe considerare tutto ciò che è dopo il primo uguale come valore.


8
tranne lo spazio bianco iniziale (oh e il "=" tra chiave e valore non è obbligatorio, potrebbe essere: o uno spazio vuoto)
Brad Cupit

16

Il modo migliore per evitare questo tipo di problemi è creare proprietà a livello di codice e quindi archiviarle. Ad esempio, utilizzando un codice come questo:

java.util.Properties props = new java.util.Properties();
props.setProperty("table.whereclause", "where id=100");
props.store(System.out, null);

Questo restituirà a System.out la versione con escape corretto.

Nel mio caso l'output era:

#Mon Aug 12 13:50:56 EEST 2013
table.whereclause=where id\=100

Come puoi vedere, questo è un modo semplice per generare contenuto di file .properties che è garantito per essere corretto. E puoi mettere tutte le proprietà che vuoi.


6

Nel mio caso, due "\\" iniziali funzionano bene per me.

Ad esempio: se la tua parola contiene il carattere "#" (ad esempio aa # 100, puoi eseguire l'escape con due "\\" iniziali

   key= aa\\#100


Secondo questo, hai bisogno di due backslash (glassfish 4.1, build 13)
Susanta


2

In Spring o Spring avviare il file application.properties qui è il modo per sfuggire ai caratteri speciali;

table.whereclause = dove id '\ =' 100


0

Questo metodo dovrebbe aiutare a generare a livello di codice valori garantiti per essere compatibili al 100% con i .propertiesfile:

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

Puoi chiamarlo così:

final String escapedPath = escapePropertyValue("C:\\Users\\X");
writeToFile(escapedPath); // will pass "C\\:\\\\Users\\\\X"

Questo metodo è un po 'costoso, ma la scrittura di proprietà su un file è comunque un'operazione sporadica.


-1

Sono stato in grado di inserire valori all'interno del carattere ":

db_user="postgresql"
db_passwd="this,is,my,password"

Perché downvoting? È una vera risposta :)
russellhoff

Op dice che le proprietà Java, le virgolette non funzionano in questo modo nei file delle proprietà Java.
teknopaul
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.