Escribiendo a archivo .properties desde aplicacion web

En un bean de una aplicacion web cargo un archivo de propiedades desde el classpath de la siguiente forma:

 Properties props= new Properties();
           InputStream is = this.getClass().getResourceAsStream( "conf.properties" );
           

El problema viene al accesar los valores, modificarlos e intentar guardarlos.

             props.setProperty("llave", valor);
            FileOutputStream fos= new FileOutputStream("conf.properties");
            props.store(fos, "sistema");

No me marca ningun error pero tampoco funciona. Imagino que no es posible guardar valores a un .properties cuando han sido cargados desde el classpath. ¿Hay alguna otra forma de hacer cambios al archivo?

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

Esta raro. Yo corri este

Esta raro.

Yo corri este ejemplo y funciona siempre.

<pre>
import java.io.*;
import java.util.*;

public class LoadStore {
        public static void main( String [] args ) throws IOException {
                Properties p = new Properties();
                p.load(p.getClass().getResourceAsStream("/p.properties"));
                p.list(System.out);
                p.put("date", String.format("%s",new Date()));
                p.store( new FileOutputStream("p.properties"), "sistema");
        }
}
$java LoadStore
-- listing properties --
a=b
date=Sat Nov 27 09:16:04 CST 2010
$java LoadStore
-- listing properties --
a=b
date=Sat Nov 27 09:16:21 CST 2010
$java LoadStore
-- listing properties --
a=b
date=Sat Nov 27 09:16:23 CST 2010
$java LoadStore
-- listing properties --
a=b
date=Sat Nov 27 09:16:25 CST 2010
$java LoadStore
-- listing properties --
a=b
date=Sat Nov 27 09:16:26 CST 2010
$java LoadStore
-- listing properties --
a=b
date=Sat Nov 27 09:18:02 CST 2010

</pre>

Lo que pudiera estar pasando es que lo está escribiendo en otro lado del que tu crees ( probablemente estes usando un IDE )

Veamos, estás leyendo con getResourceAsStream() que lo busca en el classpath. Basta con que esté en algun directorio del classpath para que lo encuentre, pero luego lo estas escribiendo con una ruta relativa ( "p.properties" ). Cuando tu vas a buscarlo de donde lo cargo, no lo encuentras por que lo escribio en otro lado. Generalmente este otro lado es el directorio de salida del IDE

Para comprobarlo, cambia la ruta donde escribe a una absoluta ( como p.store(new FileOutputStream("C:/Users/tu/aquiEsta.properties"), "prueba") Y verás que si se está escribiendo.

Si es así, lo siguiente que tienes que hacer es que leas y escribas de la misma forma:

Por ejemplo:

URL url = this.getClass().getResource("p.properties"");

File f = new File( url.getFile() ); // da una ruta absoluta al archivo

p.load( new FileInputStream( f )  );
...
p.store( new FileOutputStream( f ) , "

xyz");

Así estarás leyendo y escribiendo al mismo archivo siempre.

Ahi nos dices si funcionó o no.

Si!

Excelente, eso sirvio. Gracias!

(Y)

(Y)