Posterior a consultar con expertos en la materia, programadores de deferentes ramas y profesores hemos dado con la respuesta al problema y la compartimos en esta publicación.
Solución:
Poner las propiedades en el Properties
objeto y guárdelo usando un store(...)
método. El método realizará cualquier escape requerido. La documentación de Java dice:
“… Para el key, todos los caracteres de espacio se escriben con un carácter anterior. Para el elemento, los caracteres de espacio iniciales, pero no los caracteres de espacio incrustados o finales, se escriben con un carácter precedente. Él key y los caracteres de elemento #, !, = y : se escriben con una barra invertida al principio para asegurarse de que se carguen correctamente”.
Solo necesita escapar caracteres manualmente si está creando/escribiendo el archivo a mano.
Por el contrario, si desea que el archivo contenga caracteres de dos puntos sin escape, no tiene suerte. Dicho archivo tiene un formato incorrecto y probablemente no se cargará correctamente con el Properties.load(...)
métodos. Si sigue esta ruta, deberá implementar sus propios métodos personalizados de carga y/o almacenamiento.
Me encontré con el mismo problema. barras diagonales /
también ser escapado por el store()
método en Properties
.
Resolví este problema creando mi propio CustomProperties
clase (que se extiende java.util.Properties
) y comentando la llamada a saveConvert()
en el customStore0()
método.
Aquí está mi CustomProperties
clase:
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();
Llegamos a esta pregunta hace un par de días. 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, 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 store 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();