Jak uciec przed znakami równości w plikach właściwości

84

Jak uniknąć znaku równości ( =) w plikach właściwości Java? Chciałbym umieścić w moim pliku coś takiego:

table.whereclause=where id=100
joshua
źródło

Odpowiedzi:

83

Ponadto zapoznaj się z metodą load (Reader reader) z Propertyklasy na javadoc

W load(Reader reader)dokumentacji metody jest napisane

Klucz zawiera wszystkie znaki w linii startu z pierwszego znaku przestrzeni non-białym i do, ale nie w tym, pierwszy Niecytowany '=', ':'lub znak spacji bieli innego niż terminatora linii. Wszystkie te znaki zakończenia klucza mogą być zawarte w kluczu, poprzedzając je znakiem ukośnika odwrotnego; na przykład,

\:\=

byłby dwuznakowy klucz Znaki ":=". terminatora linii mogą być uwzględnione przy użyciu sekwencji ucieczki \ri \n. Wszelkie odstępy po kluczu są pomijane; jeśli pierwszym niebiałym znakiem po kluczu jest '=' lub ':', to jest on ignorowany i wszystkie znaki odstępu po nim również są pomijane. Wszystkie pozostałe znaki w linii stają się częścią powiązanego ciągu elementów; jeśli nie ma pozostałych znaków, elementem jest pusty ciąg "". Po zidentyfikowaniu nieprzetworzonych sekwencji znaków tworzących klucz i element, wykonywane jest przetwarzanie ucieczki, jak opisano powyżej.

Mam nadzieję, że to pomoże.

Mohd Farid
źródło
89

W twoim konkretnym przykładzie nie musisz uciekać przed równymi - musisz uciec tylko wtedy, gdy jest to część klucza. Format pliku właściwości będzie traktował wszystkie znaki występujące po pierwszym znaku równości bez zmiany znaczenia jako część wartości.

wrschneider
źródło
12
nie wiem, dlaczego nie zostało to zaznaczone! Najprostsza poprawna odpowiedź! I przez większość czasu ludzie szukają ucieczki wartości w pliku właściwości!
Tejas,
1
Mała korekta: wszystkie znaki po pierwszych równych częściach bez znaku zmiany znaczenia i spacjach końcowych będą traktowane jako wartość, to znaczy spacje wiodące w wartości zostaną usunięte. Przykład „mójKlucz = moja wartość” jest tym samym, co „mójKlucz = moja wartość”.
Paulo Merson
23

Domyślnym znakiem zmiany znaczenia w Javie jest „\”.
Jednak plik właściwości Java ma format klucz = wartość, powinien uwzględniać wszystko po pierwszej równej wartości.

Padmarag
źródło
7
z wyjątkiem wiodących białych spacji (oh i '=' między kluczem a wartością nie jest wymagane, może to być: lub spacja)
Brad Cupit
16

Najlepszym sposobem uniknięcia tego typu problemów jest programowe tworzenie właściwości, a następnie ich przechowywanie. Na przykład używając takiego kodu:

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

Spowoduje to wyświetlenie System.out wersji z poprawną zmianą znaczenia.

W moim przypadku wynik był następujący:

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

Jak widać, jest to łatwy sposób na wygenerowanie poprawnej zawartości plików .properties. Możesz umieścić dowolną liczbę nieruchomości.

mvmn
źródło
6

W moim przypadku dwa wiodące „\\” działają dobrze dla mnie.

Na przykład: jeśli twoje słowo zawiera znak „#” (np. Aa # 100, możesz go zmienić za pomocą dwóch wiodących „\\”

   key= aa\\#100

Monsif EL AISSOUSSI
źródło
Po drugie, potrzebujesz dwóch
ukośnych ukośnych
2

Możesz zajrzeć tutaj Czy klucz we właściwości Java może zawierać pusty znak?

dla ucieczki równe '=' \ u003d

table.whereclause = gdzie id = 100

klucz: [table.whereclause] wartość: [gdzie id = 100]

table.whereclause \ u003dwhere id = 100

klucz: [table.whereclause = gdzie] wartość: [id = 100]

table. gdzie klauzula \ u003dgdzie \ u0020id \ u003d100

klucz: [table.whereclause = gdzie id = 100] wartość: []

Veaceslav Serghienco
źródło
2

W pliku application.properties Spring lub Spring jest to sposób na uniknięcie znaków specjalnych;

table.whereclause = gdzie id '\ =' 100

sent.ror
źródło
0

Ta metoda powinna pomóc w programowym generowaniu wartości gwarantujących 100% zgodność z .propertiesplikami:

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

Możesz to nazwać tak:

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

Ta metoda jest trochę kosztowna, ale zapisywanie właściwości do pliku i tak jest zwykle sporadyczną operacją.

DanielCuadra
źródło
-1

Udało mi się wprowadzić wartości w znaku „:

db_user="postgresql"
db_passwd="this,is,my,password"
russellhoff
źródło
Dlaczego głosować w dół? To prawdziwa odpowiedź :)
russellhoff
Op mówi, że właściwości Java, cudzysłowy nie działają w ten sposób w plikach właściwości Java.
teknopaul