HOWTO · Java

Archivo de propiedades en Java

Este artículo trata sobre el archivo de propiedades en Java.

En esta página

La clase Properties de Java almacena la configuración de una aplicación como pares clave-valor, normalmente en un archivo con la extensión .properties. Usa setProperty() para añadir claves y valores de tipo cadena, store() para guardarlos, load() para leerlos y getProperty() para recuperar una opción. El método list() permite mostrar las entradas cargadas para inspeccionarlas.
El trabajo con archivos .properties se trata en el grupo de E/S de archivos y propiedades del Tutorial de Java, donde se reúnen las guías de configuración de Java.

Crear y establecer valores en un archivo de propiedades de Java

Un archivo de propiedades tiene una entrada por línea. Por ejemplo, version=1.1 y projectName=PropertiesFileExample son entradas distintas; una línea que comienza con # o ! es un comentario. El formato admite =, : o espacios en blanco como separadores entre la clave y el valor. Se ignoran los espacios en blanco iniciales antes de una clave, y los valores pueden contener espacios. Usa setProperty() para añadir cada par y luego store() para escribir la colección y, opcionalmente, un comentario.

Ejecuta este ejemplo:

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

import java.io.IOException;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Properties;

public class JavaExample {
  public static void main(String[] args) throws IOException {
    Path directory = Files.createTempDirectory("properties-demo-");
    Path file = directory.resolve("myConfigs.properties");

    Properties properties = new Properties();
    properties.setProperty("version", "1.1");
    properties.setProperty("projectName", "PropertiesFileExample");
    properties.setProperty("date", "2021/12/27");

    try (OutputStream output = Files.newOutputStream(file)) {
      properties.store(output, "Application settings");
    }
  }
}

Files.newOutputStream() crea el archivo si no existe y lo trunca si ya existe. El directorio que lo contiene debe existir; este ejemplo crea primero un directorio temporal. El bloque try-with-resources cierra el flujo incluso si falla la escritura. Si usas una ruta fija, crea el directorio que la contiene antes de abrir el archivo. Además de las entradas, store() escribe un comentario y una marca de tiempo generada, por lo que esas líneas de comentario varían entre ejecuciones. Con un OutputStream, los caracteres no latinos se escapan según el formato de los archivos de propiedades; un Writer te permite elegir explícitamente la codificación de caracteres.

Si tu código usa java.io, new FileOutputStream(path) también crea el archivo o lo trunca, y requiere que exista el directorio que lo contiene. Ciérralo con try-with-resources, igual que el flujo anterior.

Obtener una propiedad del archivo de propiedades de Java

Para recuperar una opción, abre el archivo guardado para lectura, llama a load() en un objeto Properties y pasa la clave deseada a getProperty(). Este ejemplo escribe y lee el archivo en una sola ejecución, así que no depende de que otro programa haya dejado allí un archivo. El flujo de entrada también usa try-with-resources, que libera el archivo después de cargarlo.

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Properties;

public class JavaExample {
  public static void main(String[] args) throws IOException {
    Path directory = Files.createTempDirectory("properties-demo-");
    Path file = directory.resolve("myConfigs.properties");
    Properties saved = new Properties();
    saved.setProperty("date", "2021/12/27");

    try (OutputStream output = Files.newOutputStream(file)) {
      saved.store(output, "Application settings");
    }

    Properties loaded = new Properties();
    try (InputStream input = Files.newInputStream(file)) {
      loaded.load(input);
    }

    String date = loaded.getProperty("date");
    System.out.println(date == null ? "No date setting" : date);
  }
}

Si la clave no existe, getProperty() devuelve null; no lanza un error. Comprueba si el resultado es null cuando la opción sea opcional, o proporciona un valor alternativo con getProperty("theme", "light"). Un archivo inexistente, una ruta sin permiso de lectura u otro problema de acceso al archivo son casos distintos: al abrirlo o cargarlo se puede producir una IOException. Gestiona esa excepción en el límite de la aplicación con un mensaje útil o deja que quien llama decida cómo recuperarse. El ejemplo declara IOException en main para que el flujo de recuperación sea fácil de seguir; en una aplicación real, normalmente se captura donde se pueda aportar contexto.

Obtener todas las claves y valores del archivo de propiedades de Java

Para ver rápidamente el contenido en la consola, carga el archivo y llama a list() con System.out. El siguiente ejemplo completo crea primero su propio archivo de entrada y luego muestra las entradas cargadas. Incluye una segunda opción para que la salida ilustre más de un par clave-valor.

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Properties;

public class JavaExample {
  public static void main(String[] args) throws IOException {
    Path directory = Files.createTempDirectory("properties-demo-");
    Path file = directory.resolve("myConfigs.properties");
    Properties saved = new Properties();
    saved.setProperty("version", "1.1");
    saved.setProperty("projectName", "PropertiesFileExample");

    try (OutputStream output = Files.newOutputStream(file)) {
      saved.store(output, "Application settings");
    }

    Properties loaded = new Properties();
    try (InputStream input = Files.newInputStream(file)) {
      loaded.load(input);
    }
    loaded.list(System.out);
  }
}

list() está pensado para generar un listado de diagnóstico legible, no para servir como API general de iteración. Ni su presentación ni el orden de las entradas constituyen un formato estable que se pueda analizar o comparar. Si el código de la aplicación necesita procesar las entradas, recorre las entradas o las claves de Properties y trata cada valor como una cadena. Si importan el orden o los comentarios, conserva el archivo original como fuente de verdad: guardar propiedades sirve para almacenar datos de configuración, mientras que list() solo muestra los valores que están cargados en memoria.