Как избежать знака равенства ( =
) в файлах свойств 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, вы можете экранировать его двумя ведущими '\\'
key= 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] значение: []
Этот метод должен помочь программно генерировать значения, гарантированно на 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"