Как избежать знака равенства ( =
) в файлах свойств Java? Я хотел бы поместить в свой файл что-то следующее:
table.whereclause=where id=100
источник
Как избежать знака равенства ( =
) в файлах свойств Java? Я хотел бы поместить в свой файл что-то следующее:
table.whereclause=where id=100
Более того, обратитесь к методу load (Reader reader) из Property
класса в javadoc
В load(Reader reader)
документации метода сказано
Ключ содержит все символы в строке , начиная с первым , не пробелом и до, но не включая первый Unescaped
'='
,':'
, или белый символ пробела, кроме конца строки. Все эти символы завершения ключа могут быть включены в ключ путем экранирования их предшествующим символом обратной косой черты; например,\:\=
будет двухсимвольной клавишей.
":=".
Знаки конца строки могут быть включены с помощью\r
и\n
escape-последовательностей. Любой пробел после ключа пропускается; если первый непробельный символ после клавиши -'='
или':'
, то он игнорируется, и любые пробельные символы после него также пропускаются. Все оставшиеся символы в строке становятся частью связанной строки элемента; если нет оставшихся символов, элемент представляет собой пустую строку""
. После того, как исходные последовательности символов, составляющие ключ и элемент, идентифицированы, выполняется обработка перехода, как описано выше.
Надеюсь, это поможет.
В вашем конкретном примере вам не нужно избегать равных - вам нужно избегать его, только если это часть ключа. Формат файла свойств будет рассматривать все символы после первого неэкранированного равенства как часть значения.
В Java по умолчанию используется escape-символ '\'.
Однако файл свойств Java имеет формат key = value, он должен рассматривать все, что находится после первого, равным как value.
источник
Лучший способ избежать подобных проблем - программно создавать свойства, а затем сохранять их. Например, используя такой код:
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, которое гарантированно будет правильным. И вы можете разместить столько свойств, сколько захотите.
источник
В моем случае два ведущих '\\' у меня работают нормально.
Например: если ваше слово содержит символ '#' (например, aa # 100, вы можете экранировать его двумя ведущими '\\'
источник
Вы можете посмотреть здесь. Может ли ключ в свойстве Java содержать пустой символ?
для escape равно '=' =
table.whereclause = где id = 100
ключ: [table.whereclause] значение: [где id = 100]
table.whereclause = где id = 100
ключ: [table.whereclause = where] значение: [id = 100]
таблица. где пункт = где = = 100
ключ: [table.whereclause = где id = 100] значение: []
источник
В файле Spring или Spring boot application.properties можно избежать использования специальных символов;
table.whereclause = где id '\ =' 100
источник
Этот метод должен помочь программно генерировать значения, гарантированно на 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"
Этот метод немного дороже, но запись свойств в файл в любом случае, как правило, является спорадической операцией.
источник
Мне удалось ввести значения в символ ":
db_user="postgresql" db_passwd="this,is,my,password"
источник