Подтвердить что ты не робот

Свойства Java Backslash

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

(т.е.).

original: c:\sdjf\slkdfj.jpg

after: c:sdjfslkdfj.jpg

Как мне сделать свойства не так?

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

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

4b9b3361

Ответ 1

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

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

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

String propertyFileContents = readPropertyFileContents();

Properties properties = new Properties();
properties.load(new StringReader(propertyFileContents.replace("\\", "\\\\")));

Ответ 2

Используйте двойную обратную косую черту 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

UPDATE CREDIT к @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

Ответ 3

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

Ответ 4

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

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

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

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

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

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

Ответ 5

В дополнение к ответу 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;
}

Ответ 6

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

c:\sdjf\slkdfj.jpg 

to

c:\\sdjf\\slkdfj.jpg

Ответ 7

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

BufferedReader metadataReader = new BufferedReader(new InputStreamReader(new FileInputStream("migrateSchemaGenProps.properties")));
Properties props = new Properties();
props.load(new StringReader(IOUtils.getStringFromReader(metadataReader).replace("\\", "/")));

Ответ 8

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

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

params.load(new StringReader(IOUtils.toString(paramFile.toURI(), null).replaceAll("\\\\", "/")));