Buscar..


Introducción

El objeto de propiedades contiene un par de clave y valor tanto como una cadena. La clase java.util.Properties es la subclase de Hashtable.

Se puede utilizar para obtener el valor de la propiedad en función de la clave de propiedad. La clase de propiedades proporciona métodos para obtener datos del archivo de propiedades y almacenar datos en el archivo de propiedades. Por otra parte, se puede utilizar para obtener propiedades del sistema.

Ventaja del archivo de propiedades

No se requiere la compilación, si la información se cambia desde el archivo de propiedades: si se cambia alguna información de

Sintaxis

  • En un archivo de propiedades:
  • clave = valor
  • #comentario

Observaciones

Un objeto de propiedades es un mapa cuyas claves y valores son cadenas por convención. Aunque los métodos de Map se pueden usar para acceder a los datos, los métodos getProperty , setProperty y stringPropertyNames más seguros para el uso de tipos se usan en su lugar.

Las propiedades se almacenan con frecuencia en archivos de propiedades Java, que son archivos de texto simples. Su formato está documentado a fondo en el método Properties.load . En resumen:

  • Cada par clave / valor es una línea de texto con espacios en blanco, es igual a ( = ), o colon ( : ) entre la llave y el valor. Los iguales o dos puntos pueden tener cualquier cantidad de espacios en blanco antes y después, que se ignora.
  • Los espacios en blanco iniciales siempre se ignoran, los espacios en blanco finales se incluyen siempre.
  • Se puede usar una barra invertida para escapar de cualquier carácter (excepto en minúsculas u ).
  • Una barra invertida al final de la línea indica que la siguiente línea es una continuación de la línea actual. Sin embargo, al igual que con todas las líneas, los espacios en blanco iniciales en la línea de continuación se ignoran.
  • Al igual que en el código fuente de Java, \u seguido de cuatro dígitos hexadecimales representa un carácter UTF-16.

La mayoría de los marcos, incluidas las instalaciones propias de Java SE como java.util.ResourceBundle, cargan archivos de propiedades como InputStreams. Al cargar un archivo de propiedades desde un InputStream, ese archivo solo puede contener caracteres ISO 8859-1 (es decir, caracteres en el rango de 0 a 255). Cualquier otro personaje debe ser representado como \u escapa. Sin embargo, puede escribir un archivo de texto en cualquier codificación y usar la herramienta native2ascii (que viene con cada JDK) para hacer ese escape por usted.

Si va a cargar un archivo de propiedades con su propio código, que puede ser en cualquier codificación, siempre y cuando se crea un lector (como un InputStreamReader ) basado en el correspondiente conjunto de caracteres . Luego puede cargar el archivo usando load (Reader) en lugar del método de carga heredado (InputStream).

También puede almacenar propiedades en un archivo XML simple, lo que permite que el propio archivo defina la codificación. Dicho archivo se puede cargar con el método loadFromXML . La DTD que describe la estructura de dichos archivos XML se encuentra en http://java.sun.com/dtd/properties.dtd .

Cargando propiedades

Para cargar un archivo de propiedades empaquetado con su aplicación:

public class Defaults {

    public static Properties loadDefaults() {
        try (InputStream bundledResource =
            Defaults.class.getResourceAsStream("defaults.properties")) {

            Properties defaults = new Properties();
            defaults.load(bundledResource);
            return defaults;
        } catch (IOException e) {
            // Since the resource is bundled with the application,
            // we should never get here.
            throw new UncheckedIOException(
                "defaults.properties not properly packaged"
                + " with application", e);
        }
    }

}

Los archivos de propiedades advierten: espacios en blanco al final

Eche un vistazo de cerca a estos dos archivos de propiedades que parecen ser completamente idénticos:

introduzca la descripción de la imagen aquí

excepto que en realidad no son idénticos:

introduzca la descripción de la imagen aquí

(las capturas de pantalla son de Notepad ++)

Dado que el espacio en blanco se conserva, el valor de lastName sería "Smith" en el primer caso y "Smith " en el segundo.

Muy raramente, esto es lo que los usuarios esperan y uno y solo puede especular por qué este es el comportamiento predeterminado de la clase Properties . Sin embargo, es fácil crear una versión mejorada de Properties que solucione este problema. La siguiente clase, TrimmedProperties , hace justamente eso. Es un reemplazo directo para la clase de propiedades estándar.

import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import java.util.Map.Entry;
import java.util.Properties;

/**
 * Properties class where values are trimmed for trailing whitespace if the
 * properties are loaded from a file.
 *
 * <p>
 * In the standard {@link java.util.Properties Properties} class trailing
 * whitespace is always preserved. When loading properties from a file such
 * trailing whitespace is almost always <i>unintentional</i>. This class fixes
 * this problem. The trimming of trailing whitespace only takes place if the
 * source of input is a file and only where the input is line oriented (meaning
 * that for example loading from XML file is <i>not</i> changed by this class).
 * For this reason this class is almost in all cases a safe drop-in replacement
 * for the standard <tt>Properties</tt>
 * class.
 *
 * <p>
 * Whitespace is defined here as any of space (U+0020) or tab (U+0009).
 * * 
 */
public class TrimmedProperties extends Properties {

    /**
     * Reads a property list (key and element pairs) from the input byte stream.
     * 
     * <p>Behaves exactly as {@link java.util.Properties#load(java.io.InputStream) }
     * with the exception that trailing whitespace is trimmed from property values
     * if <tt>inStream</tt> is an instance of <tt>FileInputStream</tt>.
     * 
     * @see java.util.Properties#load(java.io.InputStream) 
     * @param inStream the input stream.
     * @throws IOException if an error occurred when reading from the input stream.
     */
    @Override
    public void load(InputStream inStream) throws IOException {
        if (inStream instanceof FileInputStream) {
            // First read into temporary props using the standard way
            Properties tempProps = new Properties();
            tempProps.load(inStream);
            // Now trim and put into target
            trimAndLoad(tempProps);
        } else {
            super.load(inStream);
        }
    }

    /**
     * Reads a property list (key and element pairs) from the input character stream in a simple line-oriented format. 
     * 
     * <p>Behaves exactly as {@link java.util.Properties#load(java.io.Reader)}
     * with the exception that trailing whitespace is trimmed on property values
     * if <tt>reader</tt> is an instance of <tt>FileReader</tt>.
     * 
     * @see java.util.Properties#load(java.io.Reader) }
     * @param reader the input character stream.
     * @throws IOException if an error occurred when reading from the input stream.
     */
    @Override
    public void load(Reader reader) throws IOException {
        if (reader instanceof FileReader) {
            // First read into temporary props using the standard way
            Properties tempProps = new Properties();
            tempProps.load(reader);
            // Now trim and put into target
            trimAndLoad(tempProps);
        } else {
            super.load(reader);
        }
    }

    private void trimAndLoad(Properties p) {
        for (Entry<Object, Object> entry : p.entrySet()) {
            if (entry.getValue() instanceof String) {
                put(entry.getKey(), trimTrailing((String) entry.getValue()));
            } else {
                put(entry.getKey(), entry.getValue());
            }
        }
    }

    /**
     * Trims trailing space or tabs from a string.
     *
     * @param str
     * @return
     */
    public static String trimTrailing(String str) {
        if (str != null) {
            // read str from tail until char is no longer whitespace
            for (int i = str.length() - 1; i >= 0; i--) {
                if ((str.charAt(i) != ' ') && (str.charAt(i) != '\t')) {
                    return str.substring(0, i + 1);
                }
            }
        }
        return str;
    }
}

Guardar propiedades como XML

Almacenamiento de propiedades en un archivo XML

La forma en que almacena los archivos de propiedades como archivos XML es muy similar a la forma en que los almacenaría como archivos .properties . Solo en lugar de usar store() storeToXML() .

public void saveProperties(String location) throws IOException{
    // make new instance of properties
    Properties prop = new Properties();
    
    // set the property values
    prop.setProperty("name", "Steve");
    prop.setProperty("color", "green");
    prop.setProperty("age", "23");
    
    // check to see if the file already exists
    File file = new File(location);
    if (!file.exists()){
        file.createNewFile();
    }
    
    // save the properties
    prop.storeToXML(new FileOutputStream(file), "testing properties with xml");
}

Cuando abres el archivo se verá así.

Captura de pantalla del archivo realizado.

Cargar propiedades desde un archivo XML

Ahora, para cargar este archivo como una properties , debe llamar a loadFromXML() lugar de a load() que usaría con los archivos .propeties normales.

public static void loadProperties(String location) throws FileNotFoundException, IOException{
    // make new properties instance to load the file into
    Properties prop = new Properties();
    
    // check to make sure the file exists
    File file = new File(location);
    if (file.exists()){
        // load the file
        prop.loadFromXML(new FileInputStream(file));
        
        // print out all the properties
        for (String name : prop.stringPropertyNames()){
            System.out.println(name + "=" + prop.getProperty(name));
        }
    } else {
        System.err.println("Error: No file found at: " + location);
    }
}

Cuando ejecute este código obtendrá lo siguiente en la consola:

age=23
color=green
name=Steve


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow