Как я могу избежать знака равенства (=
) в файлах свойств Java? Я хотел бы добавить в файл что-то следующее:
table.whereclause=where id=100
Как я могу избежать знака равенства (=
) в файлах свойств Java? Я хотел бы добавить в файл что-то следующее:
table.whereclause=where id=100
Кроме того, обратитесь к загрузке (читателю) из класса Property
в javadoc
В документации по методу load(Reader reader)
говорится:
Ключ содержит все символы в строке, начинающейся с первой небелый пробел и до, но не включая, первый неэкранированный
'='
,':'
или символ пробела кроме терминатора линии. Все эти ключевые символы завершения могут быть включенным в ключ, избегая их с предыдущей обратной косой чертой персонаж; например,\:\=
будет двухсимвольным ключом
":=".
Линейные символы-ограничители могут быть включая использование\r
и\n
escape последовательности. Любое пустое пространство после ключ пропускается; если первый небелый пробел после клавиши'='
или':'
, то он игнорируется и любой символы пробела после тоже пропущен. Все остальные символы на линии становятся частью связанная строка элемента; если здесь нет оставшихся символов, element - пустая строка""
. однажды последовательности сырого символа составляющие ключ и элемент, являются идентифицированная обработка перехода как описано выше.
Надеюсь, что это поможет.
В вашем конкретном примере вам не нужно избегать равных - вам нужно только убежать от него, если это часть ключа. Формат файла свойств будет обрабатывать все символы после того, как первое неэкранированное значение станет частью значения.
Эквивалентный символ по умолчанию в Java - '\'.
Однако файл свойств Java имеет формат key = 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 содержать пустой символ?
для выхода равным '='\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]: []
В Spring или Spring загрузочный файл 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"