java - property - ¿Cómo escapas dos puntos(:) en el archivo de propiedades?
leer y modificar fichero de propiedades en java (4)
Estoy usando un archivo de propiedades para almacenar los valores de configuración de mi aplicación. En una de las instancias, tengo que almacenar un valor como xxx:yyy:zzz
. Cuando hago eso, se escapan los dos puntos con una barra invertida /
da como resultado el valor que se muestra como xxx/:yyy/:zzz
en el archivo de propiedades.
Soy consciente de que el dos puntos :
es un delimitador estándar de la clase Java de Properties
. Sin embargo, todavía necesito guardar el valor sin la barra invertida /
.
¿Alguna sugerencia sobre cómo manejar esto?
Si usa la variante xml del archivo de propiedades (utilizando loadFromXML
y storeToXML
) esto no debería ser un problema.
Coloque las propiedades en el objeto Properties
y guárdelo usando un método store(...)
. El método realizará cualquier escape requerido. La documentación de Java dice:
"... Para la clave, todos los caracteres espaciales están escritos con un carácter / anterior. Para el elemento, los caracteres espaciales iniciales, pero no los caracteres espaciales incrustados o finales, se escriben con un carácter / precedente. !, = y: se escriben con una barra diagonal inversa precedente para garantizar que estén correctamente cargados ".
Solo necesita escanear caracteres manualmente si está creando / escribiendo el archivo a mano.
Por el contrario, si desea que el archivo contenga caracteres de dos puntos sin guardar, no tiene suerte. Tal archivo está mal formado y probablemente no se cargará correctamente con los métodos de Properties.load(...)
. Si avanza por esta ruta, deberá implementar sus propios métodos de carga y / o almacenamiento personalizados.
Hace unos días respondimos a esta pregunta. Estábamos manipulando archivos de propiedades existentes con URL como valores.
Es arriesgado, pero si los valores de su propiedad tienen menos de 40 caracteres, entonces puede usar el método de "lista" en lugar de "almacenar":
http://docs.oracle.com/javase/6/docs/api/java/util/Properties.html#list(java.io.PrintWriter)
Echamos un vistazo rápido al código JDK y pirateamos una implementación personalizada de la tienda que funciona para nuestros propósitos:
public void store(Properties props, String propertyFilePath) throws FileNotFoundException {
PrintWriter pw = new PrintWriter(propertyFilePath);
for (Enumeration e = props.propertyNames(); e.hasMoreElements();) {
String key = (String) e.nextElement();
pw.println(key + "=" + props.getProperty(key));
}
pw.close();
}
Me encontré con el mismo problema. Las barras diagonales /
también se escapan mediante el método store()
en Properties
.
CustomProperties
este problema creando mi propia clase CustomProperties
(ampliando java.util.Properties
) y comentando la llamada a saveConvert()
en el método customStore0()
.
Aquí está mi clase CustomProperties
:
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.util.Date;
import java.util.Enumeration;
import java.util.Properties;
public class CustomProperties extends Properties {
private static final long serialVersionUID = 1L;
@Override
public void store(OutputStream out, String comments) throws IOException {
customStore0(new BufferedWriter(new OutputStreamWriter(out, "8859_1")),
comments, true);
}
//Override to stop ''/'' or '':'' chars from being replaced by not called
//saveConvert(key, true, escUnicode)
private void customStore0(BufferedWriter bw, String comments, boolean escUnicode)
throws IOException {
bw.write("#" + new Date().toString());
bw.newLine();
synchronized (this) {
for (Enumeration e = keys(); e.hasMoreElements();) {
String key = (String) e.nextElement();
String val = (String) get(key);
// Commented out to stop ''/'' or '':'' chars being replaced
//key = saveConvert(key, true, escUnicode);
//val = saveConvert(val, false, escUnicode);
bw.write(key + "=" + val);
bw.newLine();
}
}
bw.flush();
}
}