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
Odpowiedzi:
Ponadto zapoznaj się z metodą load (Reader reader) z Property
klasy 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\r
i\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.
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.
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.
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.
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
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ść: []
Ta metoda powinna pomóc w programowym generowaniu wartości gwarantujących 100% zgodność z .properties
plikami:
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ą.
Udało mi się wprowadzić wartości w znaku „:
db_user="postgresql"
db_passwd="this,is,my,password"