gentoo linux, java, software libre y otras hierbas
Feb, 04 2008 - 10:19 am

[código] Leer datos en forma secuencial, de un archivo de acceso aleatorio

En el próximo ejemplo, aprenderemos a leer datos en forma secuencial, de un archivo de acceso aleatorio en Java. Para ello es necesario haber ejecutado (y entendido) los dos ejemplos anteriores: en donde creabamos un archivo de acceso aleatorio, y donde escribiamos sobre dicho archivo.

El resultado…

imagen programa

 

 

imagen programa

El código…

Igual que en ejemplos anteriores usaremos la clase IUBanco.java, que proporciona la estructura básica de la Interfaz Gráfica:

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

La clase RegistroCuentas.java es una clase que representa un registro de información:

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

RegistroCuentasAccesoAleatorio.java que hereda de RegistroCuentas.java,y proporciona los métodos necesarios para leer o escribir al archivo:

import java.io.*;
public class RegistroCuentasAccesoAleatorio extends RegistroCuentas {

    public static final int TAMANIO = 72;

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

   // inicializar un objeto RegistroCuentasAccesoAleatorio
   public RegistroCuentasAccesoAleatorio( int cuenta, String primerNombre,
      String apellidoPaterno, double saldo )
   {
      super( cuenta, primerNombre, apellidoPaterno, saldo );
   }

   // leer un registro del objeto RandomAccecssFile especificado
   public void leer( RandomAccessFile archivo ) throws IOException
   {
      establecerCuenta( archivo.readInt() );
      establecerPrimerNombre( leerNombre( archivo ) );
      establecerApellidoPaterno( leerNombre( archivo ) );
      establecerSaldo( archivo.readDouble() );
   }

   // asegurarse que el nombre sea de la longitud apropiada
   private String leerNombre( RandomAccessFile archivo ) throws IOException
   {
      char nombre[] = new char[ 15 ], temp;

      for ( int cuenta = 0; cuenta < nombre.length; cuenta++ ) {
         temp = archivo.readChar();
         nombre[ cuenta ] = temp;
      }     

      return new String( nombre ).replace( '\0', ' ' );
   }

   // escribir un registro en el objeto RandomAccessFile especificado
   public void escribir( RandomAccessFile archivo ) throws IOException
   {
      archivo.writeInt( obtenerCuenta() );
      escribirNombre( archivo, obtenerPrimerNombre() );
      escribirNombre( archivo, obtenerApellidoPaterno() );
      archivo.writeDouble( obtenerSaldo() );
   }

   // escribir un nombre en el archivo; máximo 15 caracteres
   private void escribirNombre( RandomAccessFile archivo, String nombre )
      throws IOException
   {
      StringBuffer bufer = null;

      if ( nombre != null )
         bufer = new StringBuffer( nombre );
      else
         bufer = new StringBuffer( 15 );

      bufer.setLength( 15 );
      archivo.writeChars( bufer.toString() );
   }

} // fin de la clase RegistroCuentasAccesoAleatorio

LeerArchivoAleatorio.java que posee el método main y pone a funcionar todo:

import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.text.DecimalFormat;
import javax.swing.*;
public class LeerArchivoAleatorio extends JFrame {
   private IUBanco interfazUsuario;
   private RandomAccessFile entrada;
   private JButton botonSiguiente, botonAbrir;

   private static DecimalFormat dosDigitos = new DecimalFormat( "0.00" );

   // configurar GUI
   public LeerArchivoAleatorio()
   {
      super( "Leer archivo del cliente" );

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

      // configurar botón hacerTarea1 genérico de IUBanco
      botonAbrir = interfazUsuario.obtenerBotonHacerTarea1();
      botonAbrir.setText( "Abrir archivo para leer..." );

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

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

            // permitir al usuario seleccionar el archivo a abrir
            public void actionPerformed( ActionEvent evento )
            {
               abrirArchivo();
            }

         } // fin de la clase interna anónima  

      ); // fin de la llamada a addActionListener  

      // configurar botón hacerTarea2 genérico de IUBanco
      botonSiguiente = interfazUsuario.obtenerBotonHacerTarea2();
      botonSiguiente.setText( "Siguiente" );
      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 botonSiguiente
         new ActionListener() {

            // leer un registro cuando el usuario haga clic en botonSiguiente
            public void actionPerformed( ActionEvent evento )
            {
               leerRegistro();
            }

         } // fin de la clase interna anónima

      ); // fin de la llamada a addActionListener

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

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

            // cerrar archivo y terminar la aplicación
            public void windowClosing( WindowEvent evento )
            {
               cerrarArchivo();
            }

         } // fin de la clase interna anónima

      ); // fin de la llamada a addWindowListener

      setSize( 300, 150 );
      setVisible( true );  

   } // fin del constructor

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

      int resultado = selectorArchivo.showOpenDialog( this );

      // si el usuario hizo clic en el botón Cancelar del 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 el archivo
         try {
            entrada = new RandomAccessFile( nombreArchivo, "r" );
            botonSiguiente.setEnabled( true );
            botonAbrir.setEnabled( false );
         }

         // atrapar excepción que puede ocurrir al abrir el archivo
         catch ( IOException ioException ) {
            JOptionPane.showMessageDialog( this, "El archivo no existe",
               "Nombre de archivo incorrecto", JOptionPane.ERROR_MESSAGE );
         }   

      } // fin de instrucción else

   } // fin del método abrirArchivo

   // leer un registro
   private void leerRegistro()
   {
      RegistroCuentasAccesoAleatorio registro = new RegistroCuentasAccesoAleatorio();

      // leer un registro y mostrarlo
      try {

         do {
            registro.leer( entrada );
         } while ( registro.obtenerCuenta() == 0 );

         String valores[] = { String.valueOf( registro.obtenerCuenta() ),
            registro.obtenerPrimerNombre(), registro.obtenerApellidoPaterno(),
            String.valueOf( registro.obtenerSaldo() ) };
         interfazUsuario.establecerValoresCampos( valores );
      }

      // cerrar el archivo al llegar a su fin
      catch ( EOFException excepcionEOF ) {
         JOptionPane.showMessageDialog( this, "No hay más registros",
            "Se llegó al fin del archivo", JOptionPane.INFORMATION_MESSAGE );
         cerrarArchivo();
      }

      // procesar excepciones que pueden ocurrir por algún problema con el archivo
      catch ( IOException excepcionES ) {
         JOptionPane.showMessageDialog( this, "Error al leer el archivo",
            "Error", JOptionPane.ERROR_MESSAGE );

         System.exit( 1 );
      }

   } // fin del método leerRegistro
   // cerrar el archivo y terminar la aplicación
   private void cerrarArchivo()
   {
      // cerrar el archivo y salir
      try {
         if ( entrada != null )
            entrada.close();

         System.exit( 0 );
      }
      // procesar excepción que puede ocurrir al cerrar 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 LeerArchivoAleatorio();
   }
} // fin de la clase LeerArchivoAleatorio

Descargar código fuente

Etiquetas: ejemplos, hack, java
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.

18 Comentarios | deja el tuyo

18 Comentarios en “[código] Leer datos en forma secuencial, de un archivo de acceso aleatorio”

  1. Carlos Huerta dice:

    gracias estos programas me los pidieron en la escuela no saben como he batallado, aunque me falto uno de como hacer un registro de herramientas y crear un archivo ferreteria.dat

  2. miguel dice:

    Hombre, casidiablo o Cristian, tengo se que usted no hace tareas pero me gustaría saber si me puede responder una preguntica que para usted debe ser muy simple, tengo un “programa” en Java es una aplicacion con un menu en el cual tengo las opciones de ingresar, buscar,buscar,consultar, y eliminar los datos de un estudiante, el estudiante obviamente lo manejo como un objeto y necesito guardar ese arreglo de objetos en un archivo y bueno despuesleer los datos de los estudiantes y eliminarlso como hago eso la verdad estan muy buenos los códigos que posteó pero no se si es po mi torpeza pero sgo sin entender cmo hacer mi “programa”.

    Gracias de Antemano

  3. Cristian dice:

    miguel, todo funcionaría igual que en los ejemplos de este blog. Solo tienes que fijarte que estás leyendo y escribiendo los datos de la manera adecuada.

    Igual, lo mejor que puedes hacer es mostrarnos lo que llevas en el foro de Java de elhacker.net.

    Un saludo!

  4. isabel bucheli dice:

    deseo saber como puedo imprimir un programa hecho en eclipse aplicando awt a pdf

  5. CRISTINA dice:

    oye me parece muy bueno este sitio, realmente me ayudo a hacer un trabajo, pero ahora tengo un problema como puedo hacer para transmitir un archivo por medio de trasmision TCP o UDP.

  6. Mijael dice:

    Hola me agrado mucho tu programa y me ayudo a comprender muchas cosas, no se si me podrias ayudar con un programa que estoy haciendo ya es lo ultimo que me falta pero no entiendo. el punto es que quiero que un boton abra una presentacion de power point y la verdad no se como hacerlo espero que me puedas ayudar vale un saludo hasta luego

  7. josue dice:

    ola cristian nose si me puedas agregar necesito preguntarte urgentemente y la neta muy buen aporte de tu parte grax!!!! carnal

  8. jouse dice:

    hola casidiablo!!! anteriormente te pedi que me agregaras ya que necesito ver la forma de que me puedas ayudar. con tu programa. pork he estado pensado si hay forma de que en el menu de Procesador de transacciones hay 2 botones mas. uno para que mande a llamar el clase crear archivo y el otro de crear para no estar compilando todos y solo compilar el de procesador de transacciones. le he estado buscando la forma pero la verdad se me ha complicado un poco. de ante mano gracias por tu atencion y me gustaria que te contactaras pronto.

    • Cristian dice:

      Hola Josue… supongo que cuando dices “agregar” te refieres al messenger o algo así. Siento decirte que no uso ese tipo de programas puesto que no me gusta chatear. Si necesitas ayuda puedes preguntar en algún foro de Java… uno bueno es el de elhacker.net. Allá puedes conseguir ayuda, si preguntas adecuadamente claro está.

      Un saludo.

  9. josue dice:

    perdon casi diablo jejeje me ekivoke te puse que hubiera dos botones mas pero sin kerer repeti!!!! pero te aclaro es el de crear y el otro de leer..

    jejeje disculpa pero pues esk ya ando dormidon!!!! ya ando casi babeando el teclado!!! ja
    de antemano gracias!!!!!
    y shido!!!!

  10. josue dice:

    bueno ya resolvi mi problema me puse andarle moviendo y listo ya le agregue esas 2 opciones ahora lo que me gustaria saber!!! es pork no me actualiza vaya cuando le doy actualizar se supone que meto el numero de cuenta ok y abajo me pone cargo o abono. lo hice como en tu ejemplo pero resulta que le doy despues leerregistro y no hace nada keda= no guarda nada!!

  11. josue dice:

    ya no gracias casidiblo muy bueno tu aporte solo que le hice unos ajustes!!! ya sabes!! jurgandole y ya le en contre lo de abono y cargo!!!! para abonar pones la cantidad y le das enter en la caja de texto y para el otro le pones el menos y le das enter en la caja de texto!!!!

    y shido carnal muy buen aporte!! grax!!!

  12. aida-KmiZ dice:

    Hola!!
    una pregunta, para leer otro tipo de archivos, existe alguna excepcion??, pasa que quiero extraer datos de un archivo de mat lab (,mat). No necesito hacer operaciones en matlab, los archivs ya estan creados y solo necesito extraerlos, se trata de matrices de numeros y una lista de palabras, entonces la pregunta seria….

  13. aida-KmiZ dice:

    ok…
    dentro de los ejemplos de java, del libro de deitel, esta un ejemplo para saber si lo que pusiste en la entrada es un directorio, o es un archivo, si es un archivo te muestra lo que tiene, bien lo probe con un archivo .mat, sin embargo me arrojas datos codificados, bien, serà posible que se puedan leer archivos .mat con lectura de archivos binarios????
    bueno y para probar, como leo un archivo binario?

  14. PORFABOR DIGAMEN ESTO LO QUE LES VOY A DECIR PLISS:

    ***ESCRIBE DIFERENTES TIPOS DE ARCHIVOS Y A QUE DATOS PERTENECEN***

    PORFABOR DIGAMEN ESA RESPUESTA ES PARA MAÑANA A PRIMERA HORA
    PLISS RAPIDO PORFABOR

¡Déjanos tu comentario!