Як уникнути знака рівності у файлах властивостей


84

Як мені уникнути знака рівності ( =) у файлах властивостей Java? Я хотів би додати до свого файлу щось таке:

table.whereclause=where id=100

Відповіді:


83

Більше того, будь ласка, зверніться до методу load (Reader Reader) з Propertyкласу на javadoc

У load(Reader reader)документації до методу це сказано

Ключ містить всі символи в рядку , починаючи з першим , не пробілів і до, але не включаючи перший Unescaped '=', ':', або білий символ пропуску, крім кінця рядки. Усі ці символи закінчення клавіші можуть бути включені в ключ, екрануючи їх попереднім символом зворотної риски; наприклад,

\:\=

буде двосимвольною клавішею Символи ":=". лінійних термінаторів можуть бути включені за допомогою послідовностей \rта \nекранування. Будь-який пробіл після пропуску клавіші; якщо перший непробіл після ключа - '=' або ':', тоді він ігнорується, а будь-які пробіли після нього також пропускаються. Усі залишилися символи в рядку стають частиною асоційованого рядка елемента; якщо символів, що не залишилися, елементом є порожній рядок "". Після ідентифікації необроблених послідовностей символів, що складають ключ і елемент, виконується обробка екрану, як описано вище.

Сподіваюся, що це допомагає.


89

У вашому конкретному прикладі вам не потрібно уникати рівних - вам потрібно уникати цього, лише якщо це частина ключа. Формат файлу властивостей буде обробляти всі символи після того, як перше нескопійоване значення дорівнює.


12
не знаю, чому це не позначено! Найпростіша правильна відповідь! І більшість випадків люди шукають значення, що витікає, у файлі властивостей!
Tejas

1
Невелике виправлення: буде розглядати як значення всі символи після того, як перші нескопійовані рівні і кінцеві пробіли, тобто провідні пробіли у значенні будуть вилучені. Приклад "myKey = моє значення" те саме, що "myKey = моє значення".
Паулу Мерсон,

23

Евакуаційний символ за замовчуванням у Java - '\'.
Однак файл властивостей Java має формат key = value, він повинен розглядати все після першого рівне як значення.


7
за винятком пробілів, що ведуть (о, і '=' між ключем і значенням не потрібно, це може бути: або пробіл)
Бред Купіт

16

Найкращий спосіб уникнути такого роду проблем - це програмувати властивості, а потім зберігати їх. Наприклад, використовуючи такий код:

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, який гарантовано буде правильним. І ви можете розмістити скільки завгодно властивостей.


6

У моєму випадку два провідні "\\" працюють у мене нормально.

Наприклад: якщо ваше слово містить символ "#" (наприклад, aa # 100, ви можете уникнути цього за допомогою двох провідних "\\"

   key= aa\\#100


Повторюю, вам потрібні дві зворотні риски (скляна рибка 4.1, збірка 13)
Сусанта

2

Ви можете подивитися тут Чи може ключ у властивості 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] значення: []


2

У файлі boot.properties Spring або Spring тут є спосіб уникнути спеціальних символів;

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


0

Цей метод повинен допомогти програмно генерувати значення, гарантовано 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"

Цей метод трохи дорогий, але запис властивостей у файл, як правило, є спорадичною операцією.


-1

Я зміг ввести значення в символі ":

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

Чому голосування проти? Це справжня відповідь :)
russellhoff

Op стверджує, що властивості Java, лапки не працюють так у файлах властивостей Java.
teknopaul
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.