2012-05-22 17 views
15

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, los dos puntos se escapan con una barra diagonal \ que da como resultado el valor que se muestra como xxx\:yyy\:zzz en el archivo de propiedades.¿Cómo escapas dos puntos (:) en el archivo de propiedades?

Soy consciente de que los dos puntos : son un delimitador estándar de la clase Properties de Java. Sin embargo, todavía tengo que guardar el valor sin la barra diagonal \.

¿Alguna sugerencia sobre cómo manejar esto?

+1

me temo que no puedes.De lo contrario, ¿cómo podrían leerse los archivos de propiedades sin confundir "dos" dos puntos y dos puntos para delimitar los valores clave? – ewernli

+0

Crea un StringWriter, escribe el archivo de propiedades en él, pasa por el buffer línea por línea buscando '" \: "', y reemplazándolo por un simple '": "'. Esto no es bonito, pero de nuevo, lo que estás tratando de hacer tampoco es muy bonito. – dasblinkenlight

+1

@BhavikAmbani 'Usar expresiones regulares' para ese * cómo? * ¿Dónde exactamente tienes la oportunidad de especificar una expresión regular al guardar un archivo de propiedades, y cómo sería exactamente el RE? – EJP

Respuesta

16

Coloque las propiedades en el objeto Properties y guárdelo utilizando el método store(...). El método realizará cualquier escape requerido. El Java documentation dice:.

" ... Para la clave, todos los espacios están escritos con un carácter \ precedentes para el elemento, lo que lleva caracteres de espacio, pero que no esté integrado o caracteres de espacio, están escritos con una caracteres \ anteriores. Los caracteres #,!, = y: se escriben con una barra invertida anterior para garantizar que estén correctamente cargados ".

Solo debe 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 utilizando los métodos Properties.load(...). Si avanza por esta ruta, deberá implementar sus propios métodos de carga y/o almacenamiento personalizados.

1

Si utiliza la variante xml del archivo de propiedades (usando loadFromXML y storeToXML) esto no debería ser un problema.

+0

También me gusta este enfoque, pero el formato XML es un poco más difícil de leer para noobs ("clientes, etc.") ... Creo que debería haber una forma de escapar:, o bien utilizar algunos utils para elegir el delimitador de valores de clave, como ahora: se toma como delimitador también ... –

2

Respondemos 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 las propiedades están a menos de 40 caracteres, entonces puede utilizar el método de "lista" en lugar de "almacenamiento":

http://docs.oracle.com/javase/6/docs/api/java/util/Properties.html#list(java.io.PrintWriter)

echamos un vistazo rápido al código de JDK y pirateado 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(); 
} 
5

Me encontré con el mismo problema. Las barras diagonales / también se escapan mediante el método store() en Properties.

He resuelto este problema mediante la creación de mi propia CustomProperties clase (que se extiende java.util.Properties) y comentando la llamada a saveConvert() en el método customStore0().

Aquí es 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(); 
    } 
} 
Cuestiones relacionadas