Java: Leer Fichero

Al realizar numerosas aplicaciones medianamente flexibles, en muchas ocasiones debemos introducir diferentes parámetros de configuración para que éstas se puedan comportar de diferente modo según necesitemos. En muchas ocasiones, puede ser una buena idea el crear ciertos archivos de configuración que podamos modificar con un simple editor de textos y hacer que, de esta forma, nuestro programa trabaje de diferentes maneras.

En este articulo veremos una forma bastante sencilla de leer un fichero de texto en Java y como poder discriminar las líneas validas de los comentarios. Para ello usaremos la clase Scanner la cual nos ayudará en gran medida a poder diferenciar entre etiquetas (o variables) y sus valores correspondientes.

Antes de nada, vamos a introducir un fichero de configuración típico y que será leído por nuestro programa:
Fichero de configuración “Configuration.conf”:

# This is the configuration file of My Application
# Software version 0.1
# Aitor's Blog 2008

# TAG: filter
# Specify the default filter. 
# Possible values: esrb, icra, mpaa, mra, pegi, riaa, default.
# The default value give us the default schema used by CC
# At this version only one filter can be present
# DEFAULT: filter esrb
filter esrb

# TAG: search_multiple_ws
# If true, if Content Screening doesn't find categories
# of a given content at default Content Categorization,
# it will search different CC to obtain content's categories.
# DEFAULT: search_multiple_ws true
search_multiple_ws true

# ----------- CONTENT CATEGORIZATION -----------
# TAG: classname
# Specify the class name of the content categorization service
# DEFAULT: classname ContentCategorization
classname ContentCategorization

# TAG: namespace
# Specify the namespace of the content categorization service
# DEFAULT: namespace xs
namespace xs

Como podemos ver, este fichero de configuración posee tres “tipos” de líneas diferentes. Líneas de comentarios (que empiezan con el carácter ‘#’), líneas en blanco (para separar etiquetas y hacer mas legible el fichero) y líneas de configuración (las que realmente nos interesan).

Para poder leer este fichero usaremos la siguiente clase en Java. Esta se encargará de recorrer nuestro fichero línea a línea y solo leerá aquellas que no comiencen con el carácter ‘#’. Una vez encuentre una línea con información a leer, obtendrá el nombre de la variable y su valor y los añadirá en una tabla de hash la cual será devuelta como resultado al ejecutar esta clase.

/*Esta clase lee el fichero de configuración*/

import java.io.FileReader;
import java.io.IOException;
import java.util.Scanner;

public class ReadFile {
  public static java.util.Hashtable read() throws IOException {
    //Creamos un FileReader especificando la ruta
    //en la que se encuentra nuestro archivo de configuracion
    FileReader file = new FileReader("/ruta/configuration.conf");

    //Creamos el Objeto Scanner a partir del FileReader creado
    Scanner scanner = new Scanner(file);
    java.util.Hashtable hashFile = new java.util.Hashtable();
    //Creamos las variables donde almacenaremos el nombre
    //y el valor de cada variable de configuracion
    String name = "", value="";

    //Este bucle nos va a permitir recorrer nuestro fichero
    //hasta el final
    while (scanner.hasNextLine()) {
      //Obtenemos la siguiente linea del fichero
      Scanner line = new Scanner(scanner.nextLine());

      //Especificamos el separador introducido entre variable y
      //valor en nuestro archivo de configuracion.
      //En este caso es un espacio en blanco pero si la
      //estructura de nuestro fichero fuera variable=valor
      //usaríamos: line.useDelimiter("=");
      line.useDelimiter(" ");

      //Si la linea encontrada no esta en blanco obtenemos nombre
      //de la variable, es decir, el texto encontrado hasta
      //el primer espacio en blanco (separador)
      if(line.hasNext())
        name = line.next();

      //Si la linea no empieza por el carácter '#' y por lo tanto
      //no es un comentario y ademas tiene un valor, lo obtenemos
      if(!name.startsWith("#") & line.hasNext()){
        value = line.next();

        //Añadimos en la tabla de hash el nombre como clave
        //y el valor como valor.
        //Ademas eliminamos los posibles espacios en blanco
        hashFile.put(name.trim(), value.trim());
      }

      //Cerramos la linea
      line.close();
    }

    //Cerramos scanner y fichero
    scanner.close();
    file.close();

    //Devolvemos la tabla de hash
    return hashFile;
  }
}

Con esta clase ya podemos leer el anterior fichero de configuración o cualquier otro que mantenga este mismo formato. Hay otras formas de hacerlo pero utilizando Scanner podemos hacerlo de forma más rápida y sencilla.

Para saber cómo escribir en un fichero con Java, accede a este otro manual.

Anuncios

4 Responses to Java: Leer Fichero

  1. windoctor says:

    Hola! Es un buen tip aunque es mejor usar la clase Properties para leer archivos de configuración. COmo sugerencia, deberia ponerlo en el artículo como un comentario.

    Saludos!

  2. Aitor says:

    Hola windoctor,

    Tienes razón, hay otra forma quizá más sencilla de leer archivos de configuración que es justo la que comentas.

    Este mismo ejemplo con Properties quedaría más o menos así:

    Properties prop = new Properties();
    InputStream input = null;

    try {
    input = new FileInputStream(“/ruta/configuration.conf”);
    prop.load(input);
    } catch(Exception ex) {ex.printStackTrace();}

    Enumeration en = prop.keys();

    while (en.hasMoreElements()) {
    Object objeto = en.nextElement();
    System.out.println(objeto + ” : ” + prop.getProperty(objeto.toString()));
    }

    Creo que esto tendría que funcionar aunque no lo he probado…

    Solo sería necesario añadir estos imports:

    import java.io.FileInputStream;
    import java.io.InputStream;
    import java.util.Enumeration;
    import java.util.Properties;

    Gracias por la recomendación!

  3. cris says:

    hola necesito ayuda de como crear el fichero properties. la ayuda de esta pag me ayudo de mucho. gracias

  4. Juan says:

    interesante, gracias por el aporte.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: