Як мені уникнути знака рівності ( =
) у файлах властивостей Java? Я хотів би додати до свого файлу щось таке:
table.whereclause=where id=100
Відповіді:
Більше того, будь ласка, зверніться до методу load (Reader Reader) з Property
класу на javadoc
У load(Reader reader)
документації до методу це сказано
Ключ містить всі символи в рядку , починаючи з першим , не пробілів і до, але не включаючи перший Unescaped
'='
,':'
, або білий символ пропуску, крім кінця рядки. Усі ці символи закінчення клавіші можуть бути включені в ключ, екрануючи їх попереднім символом зворотної риски; наприклад,\:\=
буде двосимвольною клавішею Символи
":=".
лінійних термінаторів можуть бути включені за допомогою послідовностей\r
та\n
екранування. Будь-який пробіл після пропуску клавіші; якщо перший непробіл після ключа -'='
або':'
, тоді він ігнорується, а будь-які пробіли після нього також пропускаються. Усі залишилися символи в рядку стають частиною асоційованого рядка елемента; якщо символів, що не залишилися, елементом є порожній рядок""
. Після ідентифікації необроблених послідовностей символів, що складають ключ і елемент, виконується обробка екрану, як описано вище.
Сподіваюся, що це допомагає.
У вашому конкретному прикладі вам не потрібно уникати рівних - вам потрібно уникати цього, лише якщо це частина ключа. Формат файлу властивостей буде обробляти всі символи після того, як перше нескопійоване значення дорівнює.
Евакуаційний символ за замовчуванням у 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 містити порожній символ?
для втечі дорівнює '=' =
table.whereclause = де id = 100
ключ: [table.whereclause] значення: [де id = 100]
table.whereclause = де id = 100
ключ: [table.whereclause = де] значення: [id = 100]
table.whereclause \ u003dwhere \ u0020id = 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"