2009-10-16 12 views
10

Tengo un Properties objeto Java que me carga de una en memoria String, que se ha cargado previamente en la memoria desde el archivo real .properties así:propiedades Java oponerse a cadena

this.propertyFilesCache.put(file, FileUtils.fileToString(propFile)); 

El util fileToString lee realidad en el texto del archivo y el resto del código lo almacena en un HashMap llamado propertyFilesCache. Más tarde, leí el texto del archivo de la HashMap como String y volver a cargar en un objeto Java Properties así:

String propFileStr = this.propertyFilesCache.get(fileName); 
Properties tempProps = new Properties(); 
try { 
    tempProps.load(new ByteArrayInputStream(propFileStr.getBytes())); 
} catch (Exception e) { 
    log.debug(e.getMessage()); 
} 
tempProps.setProperty(prop, propVal); 

En este punto, he reemplazado mi propiedad en mi archivo de propiedades en memoria y yo quiero obtener el texto del objeto Properties como si estuviera leyendo un objeto File como lo hice arriba. ¿Hay una manera simple de hacer esto o voy a tener que iterar sobre las propiedades y crear el String manualmente?

Respuesta

22
public static String getPropertyAsString(Properties prop) {  
    StringWriter writer = new StringWriter(); 
    prop.list(new PrintWriter(writer)); 
    return writer.getBuffer().toString(); 
} 
+0

Esto hizo el truco, gracias! –

+4

Vale la pena señalar que esto no le proporcionará una representación directa de las propiedades, es decir, no puede simplemente colocar esa cadena en un archivo y volver a cargarla como un archivo de propiedades. Esto se debe a que el método ** Properties.list() ** antepone un encabezado a la lista: '- listing properties --' Es más probable que desee utilizar ** Properties.store() * * método descrito en el comentario del comentario @joev a continuación. –

2

No entiendo completamente lo que intenta hacer, pero puede usar el método de clase de clase 'store (OutputStream out, String comments). Desde el javadoc:

tienda public void (OutputStream a cabo, comentarios String) throws IOException

escribe esta lista de propiedades (pares de claves y elementos) en esta tabla Propiedades de la secuencia de salida en un formato adecuado para cargar en una tabla de Propiedades usando el método load (InputStream).

6

No está directamente relacionada con su pregunta, pero si lo que desea imprimir propiedades de depuración que puede hacer algo como esto

properties.list(System.out); 
9

Parece que hay un problema con la respuesta @Isiu . Después de ese código, las propiedades se truncan, como que hay un límite para la longitud de la cadena. forma correcta es utilizar un código como éste:

public static String getPropertyAsString(Properties prop) { 
    StringWriter writer = new StringWriter(); 
    try { 
     prop.store(writer, ""); 
    } catch (IOException e) { 
     ... 
    } 
    return writer.getBuffer().toString(); 
} 
+1

Obtiene un encabezado con una marca de tiempo con ese método. – selle

0

Otra función para imprimir todos los valores de un campo es:

public static <T>void printFieldValue(T obj) 
{ 
    System.out.printf("###" + obj.getClass().getName() + "###"); 
    for (java.lang.reflect.Field field : obj.getClass().getDeclaredFields()) { 
     field.setAccessible(true); 
     String name = field.getName(); 
     Object value = null; 
     try{ 
      value = field.get(obj); 
     }catch(Throwable e){} 
     System.out.printf("#Field name: %s\t=> %s%n", name, value); 
    } 
}