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

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

table.whereclause=where id=100

Ответ 1

Кроме того, обратитесь к загрузке (читателю) из класса Property в javadoc

В документации по методу load(Reader reader) говорится:

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

\:\=

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

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

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, которые гарантируют правильность. И вы можете добавить столько свойств, сколько хотите.

Ответ 5

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

Например: если ваше слово содержит символ "#" (например, aa # 100, вы можете избежать его с помощью двух ведущий '\\'

   key= aa\\#100

Ответ 6

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

для выхода равным '='\u003d

table.whereclause = где id = 100

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

table.whereclause\u003dwhere id = 100

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

table.whereclause\u003dwhere\u0020id\u003d100

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

Ответ 7

В Spring или Spring загрузочный файл application.properties здесь позволяет экранировать специальные символы;

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

Ответ 8

Этот метод должен помочь программно генерировать значения, которые гарантированно на 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"

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

Ответ 9

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

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