¿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
Respuestas:
Además, consulte el método de carga (lector de lector) de la Property
clase 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\r
y\n
las 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.
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.
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.
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.
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
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: []
En Spring o Spring boot el archivo application.properties aquí es la forma de escapar de los caracteres especiales;
table.whereclause = donde id '\ =' 100
Este método debería ayudar a generar valores mediante programación garantizados para ser 100% compatibles con los .properties
archivos:
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.
He podido ingresar valores dentro del carácter ":
db_user="postgresql"
db_passwd="this,is,my,password"