gentoo linux, java, software libre y otras hierbas
ene, 31 2008 - 2:36 pm

[código] Crear un archivo aleatorio en Java

Continuando con el tema de Archivos en Java, en esta entrada veremos un ejemplo simple en el que crearemos un archivo aleatorio. Para tal objetivo, utilizaremos la clase RandomAccessFile.

Los archivos aleatorios son especialmente más útiles que los archivos secuenciales que explicabamos en los ejercicios anteriores, puesto que en los secuenciales, como su nombre lo indica, tanto la lectura como la escritura se hace de manera SECUENCIAL. Por tanto, para buscar un registro en especial, es necesario (si estamos buscando de forma simple, o sea secuencial) buscar registro por registro. Este problema es solucionado con el uso de archivos aleatorios, puesto que tanto la lectura como la escritura de archivos es “directa”.

El siguiente ejemplo únicamente crea el archivo secuencial. En otras entradas del blog pondré ejemplos de escritura y lectura (eso si el tiempo me deja). Por el momento, vamos con el programa:

El resultado…

imagen programa

 

imagen programa

El código…

Tenemos 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

La clase RegistroCuentasAccesoAleatorio.java hereda de RegistroCuentas.java y proporciona los métodos necesarios para escribir sobre un 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

La clase CrearArchivoAleatorio.java, que posee el método main, muestra un cuadro de dialogo que permite al usuario crear el archivo:

import java.io.*;
import javax.swing.*;

public class CrearArchivoAleatorio {

    private static final int NUMERO_REGISTROS = 100;

   // permitir al usuario seleccionar el archivo a abrir
   private void crearArchivo()
   {
      // 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.showSaveDialog( null );

      // 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 del archivo es inválido
      if ( nombreArchivo == null || nombreArchivo.getName().equals( "" ) )
         JOptionPane.showMessageDialog( null, "Nombre de archivo incorrecto",
            "Nombre de archivo incorrecto", JOptionPane.ERROR_MESSAGE );

      else {

         // abrir el archivo
         try {
            RandomAccessFile archivo =
               new RandomAccessFile( nombreArchivo, "rw" );

            RegistroCuentasAccesoAleatorio registroEnBlanco =
               new RegistroCuentasAccesoAleatorio();

            // escribir 100 registros en blanco
            for ( int cuenta = 0; cuenta < NUMERO_REGISTROS; cuenta++ )
               registroEnBlanco.escribir( archivo );

            archivo.close(); // cerrar el archivo

            // mostrar mensaje indicando que el archivo se creó
            JOptionPane.showMessageDialog( null, "Se creó el archivo " +
               nombreArchivo, "Estado", JOptionPane.INFORMATION_MESSAGE );

            System.exit( 0 );  // terminar el programa

         } // fin del bloque try

         // procesar excepciones durante operaciones de apertura, escritura o cierre del archivo
         catch ( IOException excepcionES ) {
            JOptionPane.showMessageDialog( null, "Error al procesar el archivo",
               "Error al procesar el archivo", JOptionPane.ERROR_MESSAGE );

            System.exit( 1 );
         }

      } // fin de instrucción else

   } // fin del método crearArchivo

   public static void main( String args[] )
   {
      JDialog.setDefaultLookAndFeelDecorated(true);
      CrearArchivoAleatorio aplicacion = new CrearArchivoAleatorio();
      aplicacion.crearArchivo();
   }   

} // fin de la clase CrearArchivoAleatorio

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.

24 Comentarios | deja el tuyo

3 enlaces entrantes

21 Comentarios en “[código] Crear un archivo aleatorio en Java”

  1. ricardo dice:

    hola:
    solo qisiera saber como leer un archivo txt en java desde linux
    lo q pasa es q no c como darle la direccion del achivo
    intent acerlo como n windows pero no me funciona
    si alguien pudiera ayudarme c lo agradeceria ok…

  2. Casidiablo dice:

    Pon lo que has intentado hacer… para ver si pillamos el error!

  3. jose dice:

    Esta bien ilustrado

  4. oskar dice:

    diskulpa casidiablo cuando compilo el programa principal de CrearArchivoAleatorio me marca error en la linea return new String( nombre ).replace( ‘′, ‘ ‘ ); dela clase RegistroCuentasAccesoAleatorio
    marca estos errores
    illegal character: \8216
    illegal character: \92
    unclosed character literal
    not a statement
    en el JCreator tengo la version 1.6 del jdk
    no se si se debera a esto oke rollo no se si me podrias dar una solucion
    de antemano gracias

  5. Casidiablo dice:

    Hola oskar.

    El problema es que cuando un publica algo de este tipo en los blogs, el blog reemplaza las comillas simples por esos caracteres.

    Puedes intentar descargar el archivo original (no copiar de la página):

    http://www.casidiablo.net/codigos/Java/tema13/CrearArchivoAleatorio.zip

    O simplemente buscar las líneas que te marca como error y cambiar los caracteres tu mismo, o sea, poner manualmente las comillas sencillas.

    Un saludo!

  6. Manuel Coy dice:

    no mentiras si sirve si no que uno piensa que no ha agregado nada por lo que el boton ni cambia ni se muestra un mensaje pero ya esta bien gracias casi diablo

  7. WILLIAM dice:

    Gracias por su atención

  8. agustyn.java dice:

    oiganme..es que tengo q hace una aplicacion donde tengo que tener una opcion para que los clientes se vayan agregando y de hecho mateniendo la informacion, use este fragmento de codigo del libro de java..como programar(de ahi es original ese code),,pero cuando…corro el programa otra ves..y agrego un nuevo cliente se borran todos los ya existentes y solo queda en el archivo el q agrego en ese momento…que puedo hacer para que los q ya existen se mantengan…(no he agregado listas ni nada)….

  9. Cristian dice:

    @austyn.java: Fíjate en los otros ejemplos:

    http://www.casidiablo.net/java-random-access-file-seek/
    http://www.casidiablo.net/leer-randomaccessfile-java/

    Allí hay ejemplos… ahh, y fíjate tambien en el recuadro azul que aparece al final de cada post ;)

    Un saludo!

  10. Cristian dice:

    Ahh, y por cierto. Aquí nadie está diciendo que sabe mucho ;) Simplemente se colocan las cosas para que les quede más fácil a la gente, que a diferencia de vos, no tiene para comprarse el libro.

    Un saludo :P

  11. Leidy dice:

    Hola, bueno tengo un problemilla leyendo unos archivos.
    Tengo que leer todos los archivos de una carpeta llamada X, sin embargo no conosco el nombre de los archivos que se encuentran dentro de ella, solo se que comienzan con la fecha actual, pero la parte final del nombre es aleatoria, entonces no tengo ni idea como acceder a ellos.
    Si alguien tiene alguna idea lo agradeceria.

  12. jeancarlos dice:

    hola temgo un pequeño problemita lo que yo nrsecito es modificar una aplicacion en java. me explico…
    tengo una aplicacion que es la biblia en castellano lo que yo quiero es modificar el contenodo osea el texto de algunos versiculos de la aplicacion ojala mepuedan ayudar ik gracias de antemano

  13. Estoy trabajando la estructura de un arbol b en java. de la cual nesecito guardar en un archivo de acceso aleatorio muchos objetos de la clase pagina (dentro de esta clase se encuentran tres arreglo uno de enteros, Strings y el ultimo que guarda las direcciones de donde se encuentran los hijos en el archivo que son de la misma clase). me gustaria que me ayudaras con un ejemplo para guardar objetos en el archivo y como accederlo en forma aleatoria

  14. francisco dice:

    ola disculpa una pregunta!!! tod esta bien con el prgrama muy buen aporte de tu parte solo que me gustaria saber como le haria si kiero ver la informacion de la cuenta que cree!!! pork pues llego hasta donde dice crear hasta ahi. pero si kiero visualizar la informacion de esa cuenta!!!!! como le haria…..

    gracias de antemano y muy buen aporte carnal

¡Déjanos tu comentario!