Как избежать знака равенства в файлах свойств


85

Как избежать знака равенства ( =) в файлах свойств Java? Я хотел бы поместить в свой файл что-то следующее:

table.whereclause=where id=100

Ответы:


84

Более того, обратитесь к методу load (Reader reader) из Propertyкласса в javadoc

В load(Reader reader)документации метода сказано

Ключ содержит все символы в строке , начиная с первым , не пробелом и до, но не включая первый Unescaped '=', ':', или белый символ пробела, кроме конца строки. Все эти символы завершения ключа могут быть включены в ключ путем экранирования их предшествующим символом обратной косой черты; например,

\:\=

будет двухсимвольной клавишей. ":=". Знаки конца строки могут быть включены с помощью \rи \nescape-последовательностей. Любой пробел после ключа пропускается; если первый непробельный символ после клавиши - '=' или ':', то он игнорируется, и любые пробельные символы после него также пропускаются. Все оставшиеся символы в строке становятся частью связанной строки элемента; если нет оставшихся символов, элемент представляет собой пустую строку "". После того, как исходные последовательности символов, составляющие ключ и элемент, идентифицированы, выполняется обработка перехода, как описано выше.

Надеюсь, это поможет.


92

В вашем конкретном примере вам не нужно избегать равных - вам нужно избегать его, только если это часть ключа. Формат файла свойств будет рассматривать все символы после первого неэкранированного равенства как часть значения.


12
не знаю, почему это не было размечено! Самый простой правильный ответ! И в большинстве случаев люди ищут экранирование значения в файле свойств!
Tejas

1
Небольшая поправка: будет рассматривать как значение все символы после первого неэкранированного равенства и конечных пробелов, то есть ведущие пробелы в значении удаляются. Пример «myKey = мое значение» совпадает с «myKey = мое значение».
Пауло Мерсон

25

В Java по умолчанию используется escape-символ '\'.
Однако файл свойств Java имеет формат key = value, он должен рассматривать все, что находится после первого, равным как value.


8
кроме начальных пробелов (о, и '=' между ключом и значением не требуется, это может быть: или пробел)
Брэд Купит

16

Лучший способ избежать подобных проблем - программно создавать свойства, а затем сохранять их. Например, используя такой код:

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

Это приведет к выводу в System.out правильно экранированной версии.

В моем случае результат был:

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

Как видите, это простой способ сгенерировать содержимое файлов .properties, которое гарантированно будет правильным. И вы можете разместить столько свойств, сколько захотите.


6

В моем случае два ведущих '\\' у меня работают нормально.

Например: если ваше слово содержит символ '#' (например, aa # 100, вы можете экранировать его двумя ведущими '\\'

   key= aa\\#100



2

Вы можете посмотреть здесь. Может ли ключ в свойстве Java содержать пустой символ?

для escape равно '=' =

table.whereclause = где id = 100

ключ: [table.whereclause] значение: [где id = 100]

table.whereclause = где id = 100

ключ: [table.whereclause = where] значение: [id = 100]

таблица. где пункт = где = = 100

ключ: [table.whereclause = где id = 100] значение: []


2

В файле Spring или Spring boot application.properties можно избежать использования специальных символов;

table.whereclause = где id '\ =' 100


0

Этот метод должен помочь программно генерировать значения, гарантированно на 100% совместимые с .propertiesфайлами:

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

Вы можете назвать это так:

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

Этот метод немного дороже, но запись свойств в файл в любом случае, как правило, является спорадической операцией.


-1

Мне удалось ввести значения в символ ":

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

Почему голосование против? Это настоящий ответ :)
russellhoff

Оп говорит, что свойства Java, кавычки не работают так в файлах свойств Java.
teknopaul
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.