Обратная косая черта свойств Java - PullRequest
45 голосов
/ 26 апреля 2011

Я использую свойства Java для чтения файла свойств.Все работает нормально, но Properties молча удаляет обратную косую черту.

(то есть)

original: c:\sdjf\slkdfj.jpg

after: c:sdjfslkdfj.jpg

Как мне сделать так, чтобы Properties не делала это?

Я использую кодprop.getProperty(key)

Я получаю свойства из файла и хочу избежать добавления двойной обратной косой черты

Ответы [ 8 ]

49 голосов
/ 26 апреля 2011

Именно Properties.load () вызывает проблему, которую вы видите, поскольку обратный слеш используется для специального назначения.

Логическая строка, содержащая все данные для пары ключ-элемент может быть распространен через несколько смежных природных линии, избегая ограничителя строки последовательность с символом обратной косой черты, \.

Если вы не можете использовать предложение CoolBeans, тогда вы можете предварительно прочитать файл свойств в строку и заменить обратную косую черту двойной обратной косой чертой, а затем передать ее в Properties.load ()

String propertyFileContents = readPropertyFileContents();

Properties properties = new Properties();
properties.load(new StringReader(propertyFileContents.replace("\\", "\\\\")));
17 голосов
/ 26 апреля 2011

Используйте двойную обратную косую черту c:\\sdjf\\slkdfj.jpg

Properties props = new Properties();
props.setProperty("test", "C:\\dev\\sdk\\test.dat");
System.out.println(props.getProperty("test"));    // prints C:\dev\sdk\test.dat

ОБНОВЛЕНИЕ КРЕДИТ до @ ewh ниже.Видимо, Windows распознает косые черты.Итак, я полагаю, что вы можете сделать так, чтобы ваши пользователи писали это с помощью передней косой черты, а если вам понадобится обратная косая черта, вы можете сделать замену.Я протестировал этот фрагмент ниже, и он отлично работает.

Properties props = new Properties();
props.setProperty("test", "C:/dev/sdk/test.dat");
System.out.println(props.getProperty("test"));   // prints C:/dev/sdk/test.dat
10 голосов
/ 26 апреля 2011

Используйте вперед косые черты. В Java никогда не требуется использовать обратную косую черту в имени файла.

6 голосов
/ 01 декабря 2011

Если вам действительно нужна обратная косая черта в файле свойств, который будет загружен (например, для свойства, которое не является путем к файлу) ставьте \u005c для каждого символа обратной косой черты .

Обратная косая черта обрабатывается специально в файлах свойств, как указано в документе, предоставленном @ unhillbilly.

@ EJP: Обратная косая черта определенно необходима, если, например, вы хотите сохранить идентификатор входа NTLM в файле свойств, где форматом является DOMAIN\USERNAME с обратной косой чертой. Этот тип свойства не имя файла, поэтому косая черта не будет работать.

Редактировать: @Max Nanasy: из документа ( java.util.Properties загрузить Javadoc ), упомянутого выше (выделено мое)

Метод не обрабатывает символ обратной косой черты '\' перед недопустимым escape-символом как ошибку; обратный слеш тихо сбрасывается . Например, в строке Java последовательность «\ z» может вызвать ошибку времени компиляции. Напротив, этот метод беззвучно сбрасывает обратную косую черту. Следовательно, этот метод обрабатывает двухсимвольную последовательность "\ b" как эквивалентную одному символу "b"

У меня всегда были проблемы с обратной косой чертой в файле свойств (даже с двойной обратной косой чертой '\\'), если только я не указал юникод.

2 голосов
/ 11 октября 2016

В дополнение к ответу Bala R у меня есть следующее решение, чтобы даже сохранить новую строку-семантику обратной косой черты в конце строки.

Вот мой код:

private static Reader preparePropertyFile(File file) throws IOException {

    BufferedReader reader = new BufferedReader(new FileReader(file));
    StringBuilder result = new StringBuilder();

    String line;
    boolean endingBackslash = false;

    while ((line = reader.readLine()) != null) {
        line = line.trim();
        if (endingBackslash) {

            // if the line is empty, is a comment or holds a new property
            // definition the backslash found at the end of the previous
            // line is not for a multiline property value.
            if (line.isEmpty()
                    || line.startsWith("#")
                    || line.matches("^\\w+(\\.\\w+)*=")) {

                result.append("\\\\");
            }
        }

        // if a backslash is found at the end of the line remove it
        // and decide what to do depending on the next line.
        if (line.endsWith("\\")) {
            endingBackslash = true;
            line = line.substring(0, line.length() - 1);
        } else {
            endingBackslash = false;
        }
        result.append(line.replace("\\", "\\\\"));
    }
    if (endingBackslash) {
        result.append("\\\\");
    }
    return new StringReader(result.toString());
}

private static Properties getProperties(File file) throws IOException {
    Properties result = new Properties();
    result.load(preparePropertyFile(file));
    return result;
}
1 голос
/ 28 августа 2017

Заменить \ на \\, как показано ниже:

c:\sdjf\slkdfj.jpg 

до

c:\\sdjf\\slkdfj.jpg
0 голосов
/ 15 декабря 2015

Не очень хорошо использовать обратную косую черту в файле свойств, так как они являются escape-символом.

Тем не менее: пользователь Windows будет стремиться использовать их по любому пути ... Следовательно, в одной строке благодаря apache common IO:

params.load(new StringReader(IOUtils.toString(paramFile.toURI(), null).replaceAll("\\\\", "/")));
0 голосов
/ 24 декабря 2014

Следующий код поможет:

BufferedReader metadataReader = new BufferedReader(new InputStreamReader(new FileInputStream("migrateSchemaGenProps.properties")));
Properties props = new Properties();
props.load(new StringReader(IOUtils.getStringFromReader(metadataReader).replace("\\", "/")));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...