gentoo linux, java, software libre y otras hierbas
ene, 30 2008 - 10:50 am

[código] Leer un archivo secuencial en Java

Para el próximo ejemplo, en el que aprenderemos a leer archivos secuencialmente en Java, usando la clase ObjectInputStream, es necesario haber leído y ejecutado el programa del ejemplo pasado (en donde aprendimos a crear archivos secuenciales con la clase ObjectOutputStream).

El resultado…

El código…

Utilizamos la clase UIBanco.java, que es la misma del ejemplo anterior:

import java.awt.*;
import javax.swing.*;
public class IUBanco extends JPanel
{
	// texto de las etiquetas para la GUI
	protected final static String nombres[] = { "Número de cuenta",
      "Primer nombre", "Apellido", "Saldo", "Monto de la transacción" };

   // componentes de GUI; protegidos para el acceso futuro de las subclases
   protected JLabel etiquetas[];
   protected JTextField campos[];
   protected JButton hacerTarea1, hacerTarea2;
   protected JPanel panelInternoCentro, panelInternoSur;

   protected int tamanio; // número de campos de texto en la GUI

   // constantes que representan a los campos de texto en la GUI
   public static final int CUENTA = 0, PRIMERNOMBRE = 1, APELLIDO = 2,
      SALDO = 3, TRANSACCION = 4;

   // Configurar GUI. El argumento miTamanio del constructor determina el número de
   // filas de componentes de GUI.
   public IUBanco( int miTamanio )
   {
      tamanio = miTamanio;
      etiquetas = new JLabel[ tamanio ];
      campos = new JTextField[ tamanio ];

      // crear etiquetas
      for ( int cuenta = 0; cuenta < etiquetas.length; cuenta++ )
         etiquetas[ cuenta ] = new JLabel( nombres[ cuenta ] );

      // crear campos de texto
      for ( int cuenta = 0; cuenta < campos.length; cuenta++ )
         campos[ cuenta ] = new JTextField();

      // crear panel para distribuir etiquetas y campos
      panelInternoCentro = new JPanel();
      panelInternoCentro.setLayout( new GridLayout( tamanio, 2 ) );

      // adjuntar etiquetas y campos a panelInternoCentro
      for ( int cuenta = 0; cuenta < tamanio; cuenta++ ) {
         panelInternoCentro.add( etiquetas[ cuenta ] );
         panelInternoCentro.add( campos[ cuenta ] );
      }

      // crear botones genéricos; sin etiquetas ni manejadores de eventos
      hacerTarea1 = new JButton();
      hacerTarea2 = new JButton(); 

      // crear panel para distribuir los botones y adjuntarlos
      panelInternoSur = new JPanel();
      panelInternoSur.add( hacerTarea1 );
      panelInternoSur.add( hacerTarea2 );

      // establecer esquema de este contenedor y adjuntarle los paneles
      setLayout( new BorderLayout() );
      add( panelInternoCentro, BorderLayout.CENTER );
      add( panelInternoSur, BorderLayout.SOUTH );

      validate(); // validar esquema 

   } // fin del constructor

   // devolver referencia al botón de tarea genérico hacerTarea1
   public JButton obtenerBotonHacerTarea1()
   {
      return hacerTarea1;
   }

   // devolver referencia al botón de tarea genérico hacerTarea2
   public JButton obtenerBotonHacerTarea2()
   {
      return hacerTarea2;
   }

   // devolver referencia al arreglo campos de objetos JTextField
   public JTextField[] obtenerCampos()
   {
      return campos;
   }

   // borrar el contenido de los campos de texto
   public void borrarCampos()
   {
      for ( int cuenta = 0; cuenta < tamanio; cuenta++ )
         campos[ cuenta ].setText( "" );
   }

   // establecer valores de los campos de texto; lanzar IllegalArgumentException si
   // hay un número incorrecto de objetos String en el argumento
   public void establecerValoresCampos( String cadenas[] )
      throws IllegalArgumentException
   {
      if ( cadenas.length != tamanio )
         throw new IllegalArgumentException( "Debe haber " +
            tamanio + " objetos String en el arreglo" );

      for ( int cuenta = 0; cuenta < tamanio; cuenta++ )
         campos[ cuenta ].setText( cadenas[ cuenta ] );
   }

   // obtener arreglo de objetos String con el contenido actual de los campos de texto
   public String[] obtenerValoresCampos()
   {
      String valores[] = new String[ tamanio ];

      for ( int cuenta = 0; cuenta < tamanio; cuenta++ )
         valores[ cuenta ] = campos[ cuenta ].getText();

      return valores;
   }

} // fin de la clase IUBanco

También la clase RegistroCuentas.java, que es la misma del ejemplo anterior:

import java.io.Serializable;
public class RegistroCuentas implements Serializable
{
   private int cuenta;
   private String primerNombre;
   private String apellidoPaterno;
   private double saldo;

   // el constructor sin argumentos llama al otro constructor con valores predeterminados
   public RegistroCuentas()
   {
      this( 0, "", "", 0.0 );
   }

   // inicializar un registro
   public RegistroCuentas( int cta, String nombre, String apellido, double sald )
   {
      establecerCuenta( cta );
      establecerPrimerNombre( nombre );
      establecerApellidoPaterno( apellido );
      establecerSaldo( sald );
   }

   // establecer número de cuenta
   public void establecerCuenta( int cta )
   {
      cuenta = cta;
   }

   // obtener número de cuenta
   public int obtenerCuenta()
   {
      return cuenta;
   }

   // establecer primer nombre
   public void establecerPrimerNombre( String nombre )
   {
      primerNombre = nombre;
   }

   // obtener primer nombre
   public String obtenerPrimerNombre()
   {
      return primerNombre;
   }

   // establecer apellido paterno
   public void establecerApellidoPaterno( String apellido )
   {
      apellidoPaterno = apellido;
   }

   // obtener apellido paterno
   public String obtenerApellidoPaterno()
   {
      return apellidoPaterno;
   }

   // establecer saldo
   public void establecerSaldo( double sald )
   {
      saldo = sald;
   }

   // obtener saldo
   public double obtenerSaldo()
   {
      return saldo;
   }

} // fin de la clase RegistroCuentas

Y la clase que contiene el método main que es LeerArchivoSecuencial.java, en donde se hace uso de la clase ObjectInputStream, para leer de un archivo objetos en forma secuencial.

import java.io.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class LeerArchivoSecuencial extends JFrame
{
   private ObjectInputStream entrada;
   private IUBanco interfazUsuario;
   private JButton botonSiguiente, botonAbrir;

   // Constructor -- inicializar el marco
   public LeerArchivoSecuencial()
   {
      super( "Leer un archivo secuencial de objetos" );

      // crear instancia de la interfaz de usuario reutilizable
      interfazUsuario = new IUBanco( 4 );  // cuatro campos de texto
      getContentPane().add( interfazUsuario, BorderLayout.CENTER );

      // obtener referencia al botón de tarea genérico hacerTarea1 de IUBanco
      botonAbrir = interfazUsuario.obtenerBotonHacerTarea1();
      botonAbrir.setText( "Abrir archivo" );

      // registrar componente de escucha para llamar a abrirArchivo cuando se oprima el botón
      botonAbrir.addActionListener(

         // clase interna anónima para manejar evento de botonAbrir
         new ActionListener() {

            // cerrar archivo y terminar la aplicación
            public void actionPerformed( ActionEvent evento )
            {
               abrirArchivo();
            }

         } // fin de la clase interna anónima

      ); // fin de la llamada a addActionListener

      // registrar componente de escucha de ventana para evento de cierre de ventana
      addWindowListener(

         // clase interna anónima para manejar evento windowClosing
         new WindowAdapter() {

            // cerrar el archivo y terminar la aplicación
            public void windowClosing( WindowEvent evento )
            {
               if ( entrada != null )
                  cerrarArchivo();

               System.exit( 0 );
            }

         } // fin de la clase interna anónima

      ); // fin de la llamada a addWindowListener

      // obtener referencia al botón de tarea genérico hacerTarea2 de IUBanco
      botonSiguiente = interfazUsuario.obtenerBotonHacerTarea2();
      botonSiguiente.setText( "Siguiente registro" );
      botonSiguiente.setEnabled( false );  

      // registrar componente de escucha para llamar a leerRegistro cuando se oprima el botón
      botonSiguiente.addActionListener(

         // clase interna anónima para manejar evento de siguienteRegistro
         new ActionListener() {

            // llamar a leerRegistro cuando el usuario haga clic en siguienteRegistro
            public void actionPerformed( ActionEvent evento )
            {
               leerRegistro();
            }

         } // fin de la clase interna anónima

      ); // fin de la llamada a addActionListener

      pack();
      setSize( 350, 170 );
      setVisible( true );

   } // fin del constructor de LeerArchivoSecuencial

   // permitir al usuario seleccionar el archivo a abrir
   private void abrirArchivo()
   {
      // mostrar el cuadro de diálogo del archivo, para que el usuario pueda seleccionar el archivo a abrir
      JFileChooser selectorArchivo = new JFileChooser();
      selectorArchivo.setFileSelectionMode( JFileChooser.FILES_ONLY );

      int resultado = selectorArchivo.showOpenDialog( this );

      // si el usuario hizo clic en el botón Cancelar en el cuadro de diálogo, regresar
      if ( resultado == JFileChooser.CANCEL_OPTION )
         return;

      // obtener el archivo seleccionado
      File nombreArchivo = selectorArchivo.getSelectedFile();

      // mostrar error si el nombre de archivo es incorrecto
      if ( nombreArchivo == null || nombreArchivo.getName().equals( "" ) )
         JOptionPane.showMessageDialog( this, "Nombre de archivo incorrecto",
            "Nombre de archivo incorrecto", JOptionPane.ERROR_MESSAGE );

      else {

         // abrir archivo
         try {
            entrada = new ObjectInputStream(
               new FileInputStream( nombreArchivo ) );

            botonAbrir.setEnabled( false );
            botonSiguiente.setEnabled( true );
         }

         // procesar excepciones que pueden ocurrir al abrir el archivo
         catch ( IOException excepcionES ) {
            JOptionPane.showMessageDialog( this, "Error al abrir el archivo",
               "Error", JOptionPane.ERROR_MESSAGE );
         }      

      } // fin de instrucción else

   } // fin del método abrirArchivo

   // leer registro del archivo
   public void leerRegistro()
   {
      RegistroCuentas registro;

      // leer los valores del archivo
      try {
         registro = ( RegistroCuentas ) entrada.readObject();

         // crear arreglo de objetos String a mostrar en la GUI
         String valores[] = { String.valueOf( registro.obtenerCuenta() ),
            registro.obtenerPrimerNombre(), registro.obtenerApellidoPaterno(),
            String.valueOf( registro.obtenerSaldo() ) };

         // mostrar contenido del registro
         interfazUsuario.establecerValoresCampos( valores );
      }

      // mostrar mensaje al llegar al fin del archivo
      catch ( EOFException excepcionFinDeArchivo ) {
         botonSiguiente.setEnabled( false );

         JOptionPane.showMessageDialog( this, "No hay más registros en el archivo",
            "Fin del archivo", JOptionPane.ERROR_MESSAGE );
      }

      // mostrar mensaje de error si no se encuentra la clase
      catch ( ClassNotFoundException excepcionClaseNoEncontrada ) {
         JOptionPane.showMessageDialog( this, "No se pudo crear el objeto",
            "Clase no encontrada", JOptionPane.ERROR_MESSAGE );
      }

      // mostrar mensaje de error si no se puede leer debido a un problema con el archivo
      catch ( IOException excepcionES ) {
         JOptionPane.showMessageDialog( this,
            "Error al leer del archivo",
            "Error de lectura", JOptionPane.ERROR_MESSAGE );
      }

   } // fin del método leerRegistro

   // cerrar archivo y terminar la aplicación
   private void cerrarArchivo()
   {
      // cerrar archivo y salir
      try {
         entrada.close();
         System.exit( 0 );
      }

      // procesar excepción que puede ocurrir mientras se cierra el archivo
      catch ( IOException excepcionES ) {
         JOptionPane.showMessageDialog( this, "Error al cerrar el archivo",
            "Error", JOptionPane.ERROR_MESSAGE );

         System.exit( 1 );
      }

   } // fin del método cerrarArchivo

   public static void main( String args[] )
   {
      JFrame.setDefaultLookAndFeelDecorated(true);
      JDialog.setDefaultLookAndFeelDecorated(true);
      new LeerArchivoSecuencial();
   }

} // fin de la clase LeerArchivoSecuencial

Descargar código fuente

Los ejercicios utilizados en este post están basados en ejemplos del libro Cómo programar en Java de Deitel, y por lo tanto están bajo la licencia que esta editorial disponga.

17 Comentarios | deja el tuyo

Un enlace entrante

16 Comentarios en “[código] Leer un archivo secuencial en Java”

  1. cristina dice:

    una preguntota ¿Como borro en un archivos secuencial? x mas q lo intento no he podido lograrlo:( AYUDA X FAVOR

  2. javaco dice:

    q tal casidiablo una pregunta me guie en tu ejemplo para hacer una tarea para la u, pero me piden validar con excepciones q en el campo fecha q lo cree yo q entren solo numeros y / como hago para validarlo con un try catch gracias

  3. Manuel Coy dice:

    Hola casidiablo lo q sucede es q necesito de tu ayuda para q me ayudes a corregir unas validaciones q me toca hacer con excepciones pero no te podria escibir en la pagina por q me tiro la pagina, es solo para ver q cosas tengo q corregir porfa

  4. Casidiablo dice:

    Si no es muy largo me podrías explicar por correo: casidiablo @ elhacker.net

  5. Manuel Coy dice:

    listo te escribi al mail

  6. Manuel Coy dice:

    hola casidiablo me podrias colaborar con esto mira tengo q hacer
    Actualización de datos laborales de los participantes: número telefónico y extensión en la empresa. Exportar a un archivo plano el listado de empresas, sucursales, encargados y números telefónicos correspondientes a una sección de venta específica. Caso de evaluación: Tecnología

    pero no se como crear un archivo ni leerlo me podrias ayudar con el codigo de crear un archivo de forma sencilla y leerlo gracias

  7. Cristian dice:

    En este indice:

    http://casidiablo.net/java/

    Puedes encontrar bastantes ejemplos MUY sencillos de operaciones con archivos :P

  8. Jvidal dice:

    Que tal… CASIDIABLO quisciera saber que tipo de archivo es más facil de programar: archvos seciuenciales, de texto, ó binarios.
    Tambien quisiera saber si tu sabes sobre algun ejemplo de archivos secuenciales creado en NetBeans
    espero que me puedas responder a mi hotmail:
    jhonjvm@hotmail.com

    espero que me puedasn escribir lo más rápido posible.. Gracias hermano

  9. alberluis dice:

    casidiablo lo que pasa es que una vez que creo el archivo y despues buelbo a introducir datos los datos se sobreescriben

  10. Racha VIC dice:

    HOLA , MIRA NO SE POR KE SI ME CORRE EL PROGRAMA PERO CUANDO SE EJECUTA NO HACE NADA, SERA KE ME FALTE UNA LIBRERIA DE JAVA???

    BUENO ESPERO NO MOLESTAR, SALUDOS

  11. Cristian dice:

    Racha, esto pertenece a una serie de ejemplsos. Para que corra debes primero probar los anteriores.

    Los encuentras todos aquí:

    http://casidiablo.net/java

    Un saludo.

  12. Adriana dice:

    hola, podrias ayudarme necesito leer y escribir archivos de cualquier extension ya sea docx, jpg, pdf y no solo de txt sabras tu como puedo hacerlo eh hecho.

    Gracias saludos!!!

  13. eduardo dice:

    que hay we no manches me dejaron un archivo secuencial en java dde mezclar dos archivos que son de lectura y pues no me sale solo tengo para leer un archivo y pues no se como mezclarlo te dejo mi mail es elpinch_pita@hotmail.com si tienes tiempo pues hay mandame las lineas de codigo para mezclar sseee

  14. arely dice:

    oye nesesito una clase que genere un archivo como diccionario el cual otra pueda leer con solo la clave y buscar el archivo

  15. roberto dice:

    los dos primeros codigos el de clase UIBanco.javay RegistroCuentas.java me marca Exception in thread “main” java.lang.NoSuchMethodError: main me puedes ayudar y decirme el porque al compilar nome marca error y de este codigo me baso para hacer el mio gracias de antemano

¡Déjanos tu comentario!