Código Java – Modificar Ficheros de Propiedades en Tiempo de Ejecución

Este es el Ejemplo #23 del Topic: Programación Gráfica en Java.

Nuevamente jugando con el ResourceBundle y los ficheros de propiedades, pero a diferencia del post realizado anteriormente respecto a este tema ahora no solo veremos como acceder a los datos del fichero de propiedades, si no también poder editarlos.

Esto es muy importante porque su uso no radicará solo en desarrollar aplicaciones multi-lenguaje, sino para poder generar ficheros de configuración donde podamos almacenar datos que cambian esporádica o frecuentemente, por ejemplo, los de acceso a base de datos, establecer un idioma, una apariencia, los items seleccionados en las preferencias de la aplicación, directorios donde se almacenarán registros, etc, es decir, información externa que no requiera almacenarse en una base de datos al estilo de un cache, por ello usaremos simples ficheros de propiedades.

En el ejemplo siguiente usaremos los ficheros de propiedades creados en el post  Código Java – Internacionalización de Aplicaciones con ResourceBundle, la mayor parte del código es el mismo excepto que esta vez no nos enfocamos a la internacionalización.

Este es el procedimiento necesario para poder realizar nuestro objetivo, donde:

fichero: Ubicación del fichero .properties.
key: Palabra Clave dentro del fichero .properties.
values: Nuevo valor que reemplazará al anterior.

...
    private void escribirProperties(String fichero, String key, String value)
    {
                // Crear el objeto archivo
		File archivo = new File(this.getClass().getResource(fichero).getFile().replace("%20", " "));
		//Crear el objeto properties

                System.out.println(archivo);

		Properties properties = new Properties();
		try {
			// Cargar las propiedades del archivo
			properties.load(new FileInputStream(archivo));
			properties.setProperty(key,value);
			// Escribier en el archivo los cambios
                        FileOutputStream fos=new FileOutputStream(archivo.toString().replace("\\", "/"));

                        properties.store(fos,null);

                } catch (FileNotFoundException e) {
			System.out.println(e.getMessage());
		} catch (IOException e) {
			System.out.println(e.getMessage());
		}
    }
...

Código de Ejemplo:

/**
*Modificamos el valor del Keyword: beastieux.gui.Ejm19_Internacionalizacion.lbl3
*Del fichero /beastieux/language/LANG_es_PE.properties", creado en el Post 19.
 */

package beastieux.gui;

import java.awt.GridLayout;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;
import java.util.ResourceBundle;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

/**
 *
 * @author beastieux
 */
public class Ejm23_EscribirFicheroProperties extends JFrame {

    JLabel lbl1;
    JLabel lbl2;
    JLabel lbl3;
    JTextField txt1;
    JTextField txt2;
    JTextField txt3;
    JComboBox cmb1;
    JButton btn1;

    public Ejm23_EscribirFicheroProperties()
    {

        lbl1=new JLabel();
        txt1=new JTextField();

        lbl2=new JLabel();
        txt2=new JTextField();

        lbl3=new JLabel();
        cmb1=new JComboBox();
        cmb1.addItemListener(new java.awt.event.ItemListener() {
            public void itemStateChanged(java.awt.event.ItemEvent evt) {
                cmb1ItemStateChanged(evt);
            }
        });

        cmb1.addItem("Español");

        txt3=new JTextField();

        btn1=new JButton("Cambiar Etiqueta 3");
        btn1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btn1ActionPerformed(evt);
            }
        });

        this.add(lbl1);
        this.add(txt1);
        this.add(lbl2);
        this.add(txt2);
        this.add(lbl3);
        this.add(cmb1);
        this.add(btn1);
        this.add(txt3);
        this.setLayout(new GridLayout(4,2));
        this.setSize(500, 150);

        this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
    }

    private void btn1ActionPerformed(java.awt.event.ActionEvent evt) {
        ResourceBundle.clearCache();
        escribirProperties("/beastieux/language/LANG_es_PE.properties",
                           "beastieux.gui.Ejm19_Internacionalizacion.lbl3",
                           this.txt3.getText());

        setBundles("beastieux.language.LANG_es_PE");
    }

    private void cmb1ItemStateChanged(java.awt.event.ItemEvent evt) {

        switch(cmb1.getSelectedIndex())
        {
            case 1:setBundles("beastieux.language.LANG_es_PE"); break;
            default:setBundles("beastieux.language.LANG");
        }
    }

    private void setBundles(String propertyFile)
    {
            ResourceBundle rb = ResourceBundle.getBundle(propertyFile);

            String keyBundle="beastieux.gui.Ejm19_Internacionalizacion";

            this.setTitle(rb.getString(keyBundle + ".this"));
            this.lbl1.setText(rb.getString(keyBundle + ".lbl1"));
            this.lbl2.setText(rb.getString(keyBundle + ".lbl2"));
            this.lbl3.setText(rb.getString(keyBundle + ".lbl3"));

    }

    private void escribirProperties(String fichero, String key, String value)
    {
                // Crear el objeto archivo
		File archivo = new File(this.getClass().getResource(fichero).getFile().replace("%20", " "));
		//Crear el objeto properties

                System.out.println(archivo);

		Properties properties = new Properties();
		try {
			// Cargar las propiedades del archivo
			properties.load(new FileInputStream(archivo));
			properties.setProperty(key,value);
			// Escribier en el archivo los cambios
                        FileOutputStream fos=new FileOutputStream(archivo.toString().replace("\\", "/"));

                        properties.store(fos,null);

                } catch (FileNotFoundException e) {
			System.out.println(e.getMessage());
		} catch (IOException e) {
			System.out.println(e.getMessage());
		}
    }

        public static void main(String args[]) {
        Ejm23_EscribirFicheroProperties obj = new Ejm23_EscribirFicheroProperties();
        obj.setVisible(true);
    }
}

Pueder ir al artículo principal:

Códigos Sencillos hechos en Java

7 thoughts on “Código Java – Modificar Ficheros de Propiedades en Tiempo de Ejecución

  1. ola bro, kisiera saber si sabes como modificar el sistema operativo java de alcatel ot901, ya q hay aplicaciones y detalles que CLARO ha puesto y modificado en el telefono q no me gustan y aparte sus iconos no son los originales de ALCATEL. graxias

  2. Hola quisiera saber si tienes idea de como ver el codigo de una aplicacion en java, solo tengo el ejecutable y necesito modificarle y no se como acceder al codigo base para poder hacerlo, me sugerian usar ressbark o alg oasi pero no me deja editar.

  3. hola como estas … oye megustaria saber como se hace un interfaz es tengo un trabajo lo cual tengo que realizar por medio de la consola y encerrar esto en un trianguloo rombos circulos en fin (interfaz). ya ise i codigo peor no se ocmo insertar interfaces o como se realizan .. gracias por tu colaboracion

  4. Hola, quisiera saber si ,e podrias proporcionar el codio de ejemplo para descargar, para entenderle mejor,
    ya que asi como se escuha de facil, no lo es, si pudieras ayudarme con eso, seria muy amable de mi parte, lo que pasa que estoy desarrollando una aplicacion de escritorio, un proyecto para la escuela, y la verdd, es que se hizo desde hace un cuatrimestre pasado, mas que nada quisiera saber como separar todos los textos que tengo dentro del codigo, por ejemplo, los textos de los JOption, JButtons, labels, jComboBox, etc

    de antemano muchas gracias por este fabuloso ejemplo XD

    1. Hola Adrian, pues el código de ejemplo es tal como está publicado aquí solo debes hacer un copy-paste en tu clase, ahh, pon esa clase dentro de un paquete llamado gui.

      Estos son los dos ficheros properties que necesitarás.

      Fichero: LANG.properties
      beastieux.gui.Ejm19_Internacionalizacion.this=Configuración
      beastieux.gui.Ejm19_Internacionalizacion.lbl1=País
      beastieux.gui.Ejm19_Internacionalizacion.lbl2=Ciudad
      beastieux.gui.Ejm19_Internacionalizacion.lbl3=Idioma

      Fichero: LANG_es_PE.properties
      beastieux.gui.Ejm19_Internacionalizacion.this=Configuración
      beastieux.gui.Ejm19_Internacionalizacion.lbl1=País
      beastieux.gui.Ejm19_Internacionalizacion.lbl2=Ciudad
      beastieux.gui.Ejm19_Internacionalizacion.lbl3=Idioma

      En la raiz de tu proyecto crea un paquete llamado language y ponerlo dentro los dos ficheros mencionados.

      Por último, sustituya en tu proyecto todas las palabras “beastieux” por el nombre del paquete en el que estás trabajando, dentro de ese paquete deberán estar tanto gui como language, reemplaza tmb beastieux por el nombre del paquete padre en los ficheros properties, eso es todo para k funcione correctamente.
      La estructura de directorios(paquetes) para que te des cuenta lo puedes ver :
      aquí
      Saludos!

  5. Hey que buenisimo ejemplo, no habia visto uno igual este es bastante original me gusto mas que los anteriores pero ya lo revise y tengo una duda disculpa pero la clase ResourceBundle no la he visto me podrias explicar para que sirve, aunque en realidad yo he trabajado poco con las propiedades me gustaria que comentaras un poco mas acerca de la clase Properties y ResourceBundle.
    Creo que hoy si no pude criticarte nada pero bueno aprendi el uso de dos nuevas clases, no se me habia ocurrido bien hecho man.

    1. HOla de nuevo Edwin, pues como ves en el método setBundles instanciamos un “ResourceBundle rb”, con ello lo que quiero hacer es setear los textos de mis labels, los nombre de mis frames, etc, es decir todos los textos que serán visibles en la GUI, pero no directamente desde el código fuente, no hacer algo como milabel.setText(“Label 1”); en vez de eso obtener esos textos desde un fichero properties, por ejemplo en el fichero propertie la primera linea tiene algo como: LABEL1=Mi Etiqueta entonces al ResourceBundle le paso la palabra clave que es LABEL1, y me devuelve “Mi Etiqueta”, entiendes?, es decir si queremos cambiar esos textos no es necesario ir al código, si no sólo tener que cambiar en el fichero propertie, por eso que una funcionalidad es tener varios ficheros properties en diferentes idiomas como se explicó en un post anterior para tener aplicaciones en múltiples idiomas o que estos ficheros nos sirvan para guardar datos temporales al estilo de los caches.

Deja un comentario