Escritura de registros en un Fichero externo

Hace unas semanas estuvimos viendo cómo podíamos leer registros procedentes de un fichero externo. Hoy vamos a echarle un vistazo a la operación complementaria, esto es, vamos a revisar un método que nos permita realizar escritura de registros en un fichero de texto externo. La función de escritura es tan útil como la de lectura, ya que nos permitirá generar un fichero plano con el contenido que deseemos y trasladarlo de forma sencilla de un módulo a otro de la aplicación. En cuanto a la complejidad de esta operación, veremos que es similar a la del proceso de lectura. 

 



La idea del ejercicio de hoy será comenzar con una lista de String que simularán ser registros recibidos desde otro proceso y proceder a la escritura de los mismos en un fichero plano de salida. Esto nos permitirá, por ejemplo, proporcionarle al usuario un fichero con el listado que solicitó previamente a través de la aplicación o incluso transferir un fichero plano desde nuestro sistema hasta un sistema externo. Las posibilidades son variadas, pero creo que queda clara la utilidad de poder implementar una operativa como la que vamos a ver.

 

Escritura de registros en un Fichero externo


Para ver cómo se implementa la escritura de un fichero, vamos a revisar el siguiente ejemplo. Partiremos de una lista de criptodivisas que nuestro proceso deberá ir leyendo y, al mismo tiempo, almacenando en un fichero de texto de salida. Una vez concluido todo el procesamiento, al final deberemos tener un fichero que contenga una línea por cada registro incluido en la lista inicial.


// **************************************************

package com.universo.fichero.defecto;

 

import java.io.BufferedWriter;

import java.io.File;

import java.io.FileWriter;

import java.io.IOException;

import java.text.DateFormat;

import java.text.SimpleDateFormat;

import java.util.ArrayList;

import java.util.Arrays;

import java.util.Date;

import java.util.List;

 

public class AppEscrituraFichero {

 

      public static void main(String[] args) {

        // TODO Auto-generated method stub

 

        List<String> listaEntrada = new ArrayList(Arrays.asList("Shiba Inu", "Terra",                                         "Avalanche", "Litecoin", "Uniswap", "Chainlink",                                             "Algorand", "Polygon", "Vechain", "Stellar"));

       

        System.out.println ("Escritura de fichero externo...");

            

        // Cargamos la lista de registros que queremos escribir en el fichero

        List<String> listaRegistros = listaEntrada;

            

        // Establecemos el directorio de salida

        String path = "C:/tmp/";

        File dirSalida = new File(path);

            

        // Verificamos si existe el directorio de salida

        if(!dirSalida.isDirectory()) {

              System.out.println("No existe el directorio de salida: " + path);

              System.exit(1);

        }

            

        // Calculamos la fecha de ejecucion del proceso

        DateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");

        Date date = new Date();

        String execDate = dateFormat.format(date);

        String fechaFichero = "_f" + execDate;

       

        // Establecemos la ruta del fichero de salida

        String nombreFichero = "prueba_salida" + fechaFichero + ".csv";

        String rutaSalida = path + nombreFichero;

            

        // Verificamos que no exista ya un fichero con el mismo nombre

        File ficheroSalida = new File(rutaSalida);

        if(ficheroSalida.exists() && ficheroSalida.isFile()) {

              // El archivo de salida ya existe

              System.out.println("Ya existe el fichero de salida: " + rutaSalida);

              System.exit(1);

        }

     

        // Lanzamos el proceso de escritura propiamente dicho

        String file = rutaSalida;

        List<String> resultado = listaRegistros;

            

        try {

              System.out.println("Sistema Escribiendo archivo resultado: " + file);

                  

              System.out.println("*** Escritura de registros ***");

                  

              // Creacion del Buffer de escritura

              FileWriter fw = new FileWriter(file, true);

              BufferedWriter writer = new BufferedWriter(fw);

                  

              // Vamos escribiendo cada una de las lineas del fichero

              for (String linea: resultado) {

                     // Escribimos la linea leida en el buffer del fichero

                     writer.append(linea + "\n");

                     System.out.println("Registro: " + linea);

              }

              

              // Cerramos el buffer    

              writer.close();

                  

              System.out.println("*** Fin de registros ***");

                  

              System.out.println("Sistema Se finalizo la escritura del archivo");

                  

        }catch(IOException e) {  

              System.out.println("Fichero de salida: " + file);

              System.out.println("Excepcion de escritura: " + e.getMessage());

              System.exit(1);

        }

            

        System.out.println ("Fin del proceso de escritura...");

            

      }

 

}

// ************************************************** 


Detalle del proceso de Escritura de Fichero


A continuación, vamos a echarle un vistazo más detallado a cada uno de los pasos que hemos seguido para implementar el proceso anterior. Son los siguientes.

 

1º) En primer lugar, cargamos la lista de registros que posteriormente vamos a almacenar en el fichero de salida. En nuestro caso, se trata de una lista de criptodivisas.


// Cargamos la lista de registros que queremos escribir en el fichero

List<String> listaRegistros = listaEntrada;


2º) Definimos el directorio de salida en el que vamos a almacenar el fichero generado. Para ello, usaremos un objeto File. A continuación, verificamos que dicho directorio exista en el sistema de archivos de nuestra máquina.


// Establecemos el directorio de salida

String path = "C:/tmp/";

File dirSalida = new File(path);

            

// Verificamos si existe el directorio de salida

if(!dirSalida.isDirectory()) {

      System.out.println("No existe el directorio de salida: " + path);

      System.exit(1);

}


3º) Calculamos la fecha de ejecución del proceso. Este paso es opcional, pero aquí lo hacemos porque queremos que el nombre del fichero contenga la fecha del día en el que se generó. Es una buena práctica hacerlo así ya que, de ese modo, tendremos separados los ficheros de salida de las ejecuciones realizadas en diferentes lanzamientos.


DateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");

Date date = new Date();

String execDate = dateFormat.format(date);

String fechaFichero = "_f" + execDate;


4º) A continuación, establecemos la ruta en la que se va a encontrar nuestro fichero de salida. En nuestro proceso, el nombre del fichero comenzará por "prueba_salida" y llevará anexada la fecha de ejecución en formato "yyyyMMdd" (por ejemplo, "_f20210130"). Finalmente, se añadirá la extensión ".csv" al nombre. De este modo, podremos generar un fichero que se denomine, por ejemplo:

prueba_salida_f20210130.csv


// Establecemos la ruta del fichero de salida

String nombreFichero = "prueba_salida" + fechaFichero + ".csv";

String rutaSalida = path + nombreFichero;


5º) Verificamos que en el directorio no exista ya un fichero con el nombre que nos acabamos de crear. Si detectamos que ya existe, entonces tendremos que generar un error y detener el proceso.


File ficheroSalida = new File(rutaSalida);

if(ficheroSalida.exists() && ficheroSalida.isFile()) {

      // El archivo de salida ya existe

      System.out.println("Ya existe el fichero de salida: " + rutaSalida);

      System.exit(1);

}


6º) Creamos el buffer de escritura que nos permitirá ir almacenando los objetos de la lista de entrada en el fichero de salida. Esto se hace a partir de la ruta del fichero correspondiente.


FileWriter fw = new FileWriter(file, true);

BufferedWriter writer = new BufferedWriter(fw);


7º) Comenzamos a recorrer la lista de objetos de entrada (las criptodivisas). En cada iteración, almacenamos el contenido del objeto en la siguiente línea del fichero de salida. Esto lo hacemos mediante la función append() del buffer BufferedWriter.


for (String linea: resultado) {

           // Escribimos la linea leida en el buffer del fichero

           writer.append(linea + "\n");

           System.out.println("Registro: " + linea);

}


8º) Una vez finalizado el bucle sobre la lista de objetos, ya no vamos a seguir escribiendo sobre el fichero de salida. Por tanto, cerramos el buffer.


// Cerramos el buffer 

writer.close();


9º) Finalmente, imprimimos un aviso indicando que ha finalizado el proceso de lectura de la lista y de escritura del fichero de salida.

 

System.out.println("*** Fin de registros ***");

System.out.println("Sistema Se finalizo la escritura del archivo");

 

10º) Ejecutamos el proceso y, si lo hemos desarrollado según lo indicado en los pasos anteriores, el programa debería generar un fichero de salida conteniendo las criptodivisas de partida.

La salida por consola debería ser algo como esto.


Escritura de fichero externo...
Sistema Escribiendo archivo resultado: C:/tmp/prueba_salida_f20211111.csv
*** Escritura de registros ***
Registro: Shiba Inu
Registro: Terra
Registro: Avalanche
Registro: Litecoin
Registro: Uniswap
Registro: Chainlink
Registro: Algorand
Registro: Polygon
Registro: Vechain
Registro: Stellar
*** Fin de registros ***
Sistema Se finalizo la escritura del archivo
Fin del proceso de escritura...


11º) Si revisamos el contenido del fichero plano generado (en mi caso, el fichero se ha creado con el nombre "prueba_salida_f20211111.csv"), podremos observar los objetos String que se encontraban inicialmente en la lista de entrada.



Como se aprecia, el fichero contiene exactamente las 10 criptodivisas que se incluyeron en la lista de entrada. Si no habéis cometido errores al implementar el proceso, vosotros también deberíais obtener un fichero similar al de la imagen.


Al igual que vimos en su día con la lectura de ficheros, hay que remarcar la importancia de disponer de una funcionalidad de este tipo que nos permita escribir ficheros en nuestro proyecto. Hay que tener en cuenta que un proceso como este nos permitirá, por ejemplo, generar un fichero con un listado de registros para el usuario o incluso enviar un fichero de datos a un sistema externo. Como vemos, esta operativa amplía el alcance de nuestra aplicación y nos permite realizar operaciones fuera de los menús de la misma. Tenedlo en cuenta cuando estéis diseñando vuestro próximo sistema.


Pues nada, dicho esto, no me queda mucho más que comentar. Simplemente decir que, si tenéis alguna duda al respecto, me la podéis dejar aquí abajo.

Saludos.


Comentarios

Entradas populares de este blog

Componentes y Ventanas de Java Swing

Creación de Webservice SOAP básico

Fichero standalone del Servidor JBoss EAP