Cómo escapar del signo igual en los archivos de propiedades

84

¿Cómo puedo escapar del signo igual ( =) en los archivos de propiedades de Java? Me gustaría poner algo como lo siguiente en mi archivo:

table.whereclause=where id=100
Joshua
fuente

Respuestas:

83

Además, consulte el método de carga (lector de lector) de la Propertyclase en javadoc

En la load(Reader reader)documentación del método dice

La clave contiene todos los caracteres en la línea que comienza con el primer carácter de espacio no blanca y hasta, pero no incluyendo, la primera sin escape '=', ':'o blanco carácter de espacio que no sea un terminador de línea. Todos estos caracteres de terminación de clave se pueden incluir en la clave escapándolos con un carácter de barra invertida anterior; por ejemplo,

\:\=

sería la clave de dos caracteres ":=". caracteres terminador de línea se pueden incluir el uso \ry \nlas secuencias de escape. Cualquier espacio en blanco después de que se omita la clave; si el primer carácter que no es un espacio en blanco después de la tecla es '=' o ':', entonces se ignora y también se omite cualquier carácter de espacio en blanco posterior. Todos los caracteres restantes de la línea pasan a formar parte de la cadena de elementos asociados; si no quedan caracteres, el elemento es la cadena vacía "". Una vez que se identifican las secuencias de caracteres sin procesar que constituyen la clave y el elemento, el procesamiento de escape se realiza como se describe anteriormente.

Espero que ayude.

Mohd Farid
fuente
89

En su ejemplo específico, no necesita escapar de los iguales, solo necesita escapar si es parte de la clave. El formato de archivo de propiedades tratará todos los caracteres después del primer igual sin escape como parte del valor.

wrschneider
fuente
12
¡No sé por qué no se ha marcado! ¡Respuesta correcta más simple! ¡Y la mayoría de las veces la gente busca valor de escape en el archivo de propiedades!
Tejas
1
Corrección pequeña: tratará como valor todos los caracteres después de los primeros espacios iguales y finales sin escape, es decir, los espacios iniciales en el valor se eliminan. El ejemplo "myKey = my value" es lo mismo que "myKey = my value".
Paulo Merson
23

El carácter de escape predeterminado en Java es '\'.
Sin embargo, el archivo de propiedades de Java tiene el formato clave = valor, debe considerar todo después del primero igual como valor.

Padmarag
fuente
7
excepto los espacios en blanco iniciales (oh, y el '=' entre la clave y el valor no es obligatorio, podría ser: o un espacio en blanco)
Brad Cupit
16

La mejor forma de evitar este tipo de problemas es crear propiedades mediante programación y luego almacenarlas. Por ejemplo, usando un código como este:

java.util.Properties props = new java.util.Properties();
props.setProperty("table.whereclause", "where id=100");
props.store(System.out, null);

Esto se traduciría en System.out en la versión de escape adecuada.

En mi caso, la salida fue:

#Mon Aug 12 13:50:56 EEST 2013
table.whereclause=where id\=100

Como puede ver, esta es una manera fácil de generar contenido de archivos .properties que se garantiza que es correcto. Y puedes poner tantas propiedades como quieras.

mvmn
fuente
6

En mi caso, dos '\\' principales funcionan bien para mí.

Por ejemplo: si su palabra contiene el carácter '#' (por ejemplo, aa # 100, puede escapar con dos '\\' iniciales

   key= aa\\#100

Monsif EL AISSOUSSI
fuente
Segundo, necesitas dos barras invertidas (glassfish 4.1, compilación 13)
Susanta
2

Puede buscar aquí ¿Puede la clave de una propiedad Java incluir un carácter en blanco?

para escape igual '=' \ u003d

table.whereclause = donde id = 100

clave: [table.whereclause] valor: [donde id = 100]

table.whereclause \ u003d where id = 100

clave: [table.whereclause = where] valor: [id = 100]

table.whereclause \ u003dwhere \ u0020id \ u003d100

clave: [table.whereclause = donde id = 100] valor: []

Veaceslav Serghienco
fuente
2

En Spring o Spring boot el archivo application.properties aquí es la forma de escapar de los caracteres especiales;

table.whereclause = donde id '\ =' 100

enviado.ror
fuente
0

Este método debería ayudar a generar valores mediante programación garantizados para ser 100% compatibles con los .propertiesarchivos:

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);
    }
}

Puedes llamarlo así:

final String escapedPath = escapePropertyValue("C:\\Users\\X");
writeToFile(escapedPath); // will pass "C\\:\\\\Users\\\\X"

Este método es un poco caro pero, de todos modos, escribir propiedades en un archivo suele ser una operación esporádica.

DanielCuadra
fuente
-1

He podido ingresar valores dentro del carácter ":

db_user="postgresql"
db_passwd="this,is,my,password"
Russellhoff
fuente
¿Por qué votar en contra? Es una respuesta real :)
russellhoff
Op dice que las propiedades de Java, las comillas no funcionan así en los archivos de propiedades de Java.
teknopaul