10518_archivos aleatorios

download 10518_archivos aleatorios

of 20

Transcript of 10518_archivos aleatorios

  • 5/21/2018 10518_archivos aleatorios

    1/20

    Manejo de Archivos aleator ios en JAVA

    Eliana Isabel Rangel Ortega

    Camilo Jos Amaya Pez

    Prof. Folger Fonseca Velasco

    Universidad de Crdoba

    Facultad de Ciencias Bsicas e Ingeniera

    Ingeniera Industrial

    II Semestre

    Montera Crdoba

    Ao 2008

  • 5/21/2018 10518_archivos aleatorios

    2/20

    Tabla de Contenido

    Introduccin

    Objetivos

    1. Archivos aleato rios o directos

    1.1. Ejemplo

    1.2. Creacin de un Archivo de Acceso Aleatorio1.3. Grabar datos en archivos aleatorios

    1.4. Leer datos en archivos aleatorios

    1.5. Posicionarse en un registro determinado

    1.6. Mtodos y constructor es de la clase RandomAccessF ile.

    2. Ejemplos en java

    2.1. // Una clase que representa un registro de informacin.

    2.2. // Esta clase declara mtodos para manipular los registros de

    una cuenta de banco en un ar chivo de acceso al eatorio.

    2.3. // Una clase (RegistroCuentas) que representa un registro de

    informacin.

    2.3.1. // Subclase de RegistroCuentas para los programas que

    usan archivos de acceso aleatorio.

    Conclusin

    Bibliografa

  • 5/21/2018 10518_archivos aleatorios

    3/20

    Introduccin

    La forma de interactuar con los sistemas de archivos locales se realiza a travs

    de la clase File, esta clase proporciona muchas utilidades relacionadas con

    archivos y con la obtencin de informacin bsica sobre esos archivos.

    Para crear un objeto File nuevo, se puede utilizar cualquiera de los tres

    constructores siguientes:

    1. File miArchivo; miArchivo = new File( "path/mi_archivo" );

    2. iArchivo = new File( "path","mi_archivo" );

    3. ile miDirectorio = new File( "path" ); miArchivo = new File(

    miDirectorio,"mi_archivo" );

    Acceder directamente a la posicin donde se encuentra la informacin (acceso

    aleatorio) permite mucha mayor rapidez en la recuperacin de la informacin

    que acceder teniendo que leer toda la informacin hasta llegar al lugar donde

    se encuentra lo que necesitamos (acceso secuencial), por lo que no puede

    haber una librera de entrada/salida que no proporcione esta posibilidad: java.io

    incluye la clase RandomAccessF ile para este tipo de entrada/salida.

  • 5/21/2018 10518_archivos aleatorios

    4/20

    OBJETIVOS

    Objetivos Generales

    Aprender e identificar nuevos conceptos relaci onados con la temtica

    respectiva a nuestra asignatura.

    Conocer y entender temas necesarios para aplicar de manera adecuada

    los conceptos vistos, investigados y desarrollados en la asignatura.

    Diferenciar las distintas aplicaciones que podemos utilizar en el

    desarrollo de nuestro aprendizaje relacionado a la programacin.

    Desarrollar la conceptualizacin, manejo y prctica de elementos

    utilizados en la programacin para un mejor manejo y entendimiento del

    mismo.

    Objetivos Especficos

    Identificar la importancia del uso y manejo de archivos aleatorios en toda

    su extensin y especficamente en java.

    Aprender a crear correctamente archivos aleatorios en java.

    Explorar y entender toda la temtica concerniente a los archivos

    aleatorios.

    Aprender como es el funcionamiento de los archivos aleatorios.

    Aplicar los conceptos y la temtica aprendida de los archivos aleatorios

    en el desarrollo de ejercicios relacionados con el tema.

  • 5/21/2018 10518_archivos aleatorios

    5/20

    1. Archivos aleatorios o directos

    A diferencia de los archivos secuenciales, los archivos aleatorios almacenan

    datos en forma de registros. Para leer datos de un archivo aleatorio, tambin

    llamados archivos directos, los cuales almacenan los datos con una estructura

    diferente. Los datos se guardan en registros mediante una estructura definida

    de tipo Type (estructura definida por nosotros) tambin llamada UDT

    Por ejemplo si tuvisemos 25 registros, cada uno con datos (apellido, email,

    telfono, etc...), y quisiera acceder al registro 17, puedo leer los datos del

    registro 17 sin tener que leer los 16 registros anteriores, ganando con ello ms

    velocidad y teniendo una estructura de datos definida.

    Para abrir un archivo aleatorio para trabajar con l, se utiliza la sentencia Opencon algunos cambios en lo que se refiere a los archivos secuenciales.

    Ejemplo:

    open "elarchivo.dat" for random as #1 len = len(mivariable)

    Como podemos ver para abrir un archivo de acceso aleatorio se utiliza la

    palabra Random (aleatorio). Luego debemos indicar el nmero de archivo para

    identificarlo, y por ltimo una opcin nueva: Len.

    Cada registro en el archivo, que es una estructura de datos Type, tiene quetener una longitud fija. Mediante la funcin Len de visual Basic debemos indicar

    el tamao de la estructura de datos que vamos a ut ilizar.

    1.1. Ejemplo:

    Primero definimos una estructura de datos:

    Private Type t_clientes

    nombre As String * 20apellido As String * 15direccin As String * 30edad As Integer

    End Type

    Despus creamos una variable llamada clientes de tipo t_clientes

    Dim clientes As t_clientes

    ahora abrimos nuestro archivo, y en el parmetro de la funcin Len lepasamos la variable para que visual basic calcule el tamao de la

  • 5/21/2018 10518_archivos aleatorios

    6/20

    estructura t_clientes

    Open "datos.dat" For Random As #1 Len = Len( clientes)

    La estructura de datos debe tener un tamao fijo, no datos variables

    como en el caso de los archivos secuenciales, de ah que se indicara enel Type en las variables mediante el asterisco en el caso de los String.

    En cada campo de l a estructura de datos debemos i ndicar el tamao dela variable. En el caso del campo nombre de tipo string le hemosasignado una longitud fija de 20 bytes, en el apellido 15 y en la direccin30 bytes. La vari able o el campo edad que es de tipo integer, nodebemos indicar el tamao de la variable, ya que sabemos que unnmero integer ocupa 2 bytes.

    En total esta estr uctura t_clientes tiene una longitud de 67 bytes (30 + 20

    + 15 + 2).

    Si no indicramos en la sentencia Open el tamao de la estructura,visual basic, por defecto asumira la estructura de un tamao de 128bytes, y si nuestra estructura tendra mayor tamao ocurrira un error entiempo de ejecucin, por lo cual siempre debemos utilizar la funcin lenpara calcular el tamao de la misma.

    1.2. Creacin de un Archi vo de Acceso Aleatorio

    Hay dos posibilidades para abrir un archivo de acceso aleatorio:

    Con el nombre del archivo: miRAFile = new RandomAccessF ile( Stringnombre,String modo ).

    Con un objeto File: miRAFile = new RandomAccessFile( Filearchivo,String modo ).

    1.3. Grabar datos en archivo s aleator ios

    Para grabar datos en un archivo de acceso aleatorio se utiliza la sentencia Put.

    Ejemplo:

    primero declaramos una estructura de datos que contendr la informacin de

    cada registro:

    Private Type t_empleados

    nombre As String * 15

    apellido As String * 15

    direccin As String * 30

  • 5/21/2018 10518_archivos aleatorios

    7/20

    edad As Integer

    End Type

    Luego creamos una vari able que sea de tipo t_empleados.

    Dim empleados As t_empleados

    Ahora abrimos el archivo e indicamos en la funcin Len el tamao de la

    estructura

    Open "datos.dat" For Random As #1 Len = Len( clientes)

    Ahora le asignamos un valor a cada campo de l a estructura de esta forma:

    empleados.nombre = "Carlos"

    empleados.apellido = "Martinez"

    empleados.direccin = "Avenida 9 de julio n 2054"

    empleados.edad = 45

    Ahora grabamos en el registro n1 del archivo los datos de esta forma:

    Put #1, 1, empleados

    Si queremos grabar ms datos, por ejemplo en el registro n 2 del archivo

    hacemos lo siguiente:

    empleados.nombre = "Mara"

    empleados.apellido = "Gonzales"

    empleados.direccin = "Avenida 13 n 1100"

    empleados.edad = 35

    Put #1, 2, empleados

    Close #1

    Como vemos ver la sentencia Put lleva 3 parmetros. El primero indica el

    nmero de archivo abierto en el cual estamos trabajando. En el segundo

    debemos indicar el nmero de registro en el que se grabarn los datos. Si no

    ponemos el nmero de registro, los datos se grabarn en el ltimo registro. Por

    ltimo en el tercer parmetro le pasamos la variable asociada con la estructura

    de datos.

  • 5/21/2018 10518_archivos aleatorios

    8/20

    1.4. Leer datos en archivo s aleatorios

    Para leer los registros o datos de un archivo aleatorio se utiliza la sentencia

    Get. Esta sentenci a es exactamente i gual que Put, pero la diferencia es que en

    vez de grabar los datos los recupera para poder utilizarlos luego en el

    programa.

    1.5. Posicionarse en un reg ist ro determinado

    Supongamos que tenemos un ar chivo aleatorio que contiene 452 r egistros.

    Ahora queremos recuperar los datos del registro 258. Para posicionarse en un

    determinado registro hay una sentencia, hay una sentencia llamada Seek.

    Ejemplo:

    Seek #1, 258

    Get #1, mivariable

    si queremos posicionarnos en un registro determinado, pero en vez de leer,

    queremos grabar datos, hacemos la misma operacin pero con la sentencia

    Put:

    Seek #1, 258

    Put #1, , mivariable

    1.6. Mtodos y constructores de la clase RandomAccessFile.

    public class java.io.RandomAccessFile

    extends java.lang.Object

    implements java.io.DataOutput,

    java.io.DataInput

    {

    // Constructorrspublic RandomAccessFile(File archivo, String modo);

    public RandomAccessFile(String nombre, String modo);

    // Mtodos

    public void seek(long pos);

    public long length();

    public long getFilePointer();

    public int skipBytes(int n);

    public void close();

  • 5/21/2018 10518_archivos aleatorios

    9/20

    public final FileDescriptor getFD();

    public int read();

    public int read(byte b[]);

    public int read(byte b[], int off, int len);

    public void write(byte b[]);

    public void write(byte b[], int off, int len);

    public void write(int b);

    public final boolean readBoolean();

    public final byte readByte();

    public final char readChar();

    public final double readDouble();

    public final float readFloat();

    public final void readFully(byte b[]);

    public final void readFully(byte b[],

    int off, int len);

    public final int readInt();

    public final String readLine();

    public final long readLong();

    public final short readShort();

    public final int readUnsignedByte();

    public final int readUnsignedShort();

    public final String readUTF();

    public final void writeBoolean(boolean v);

    public final void writeByte(int v);public final void writeBytes(String s);

    public final void writeChar(int v);

    public final void writeChars(String s);

    public final void writeDouble(double v);

    public final void writeFloat(float v);

    public final void writeInt(int v);

    public final void writeLong(long v);

    public final void writeShort(int v);

    public final void writeUTF(String str);

    }

    Como se pude ver, se puede indicar el archivo sobre el que vamos a

    trabajar basndonos en un objeto File ya existente (primera versin del

    constructor en el Listado anterior), o especificando directamente el

    nombre del archivo (segunda versin del constructor). Adems, es

    posible indicar si deseamos abrir el archivo para lectura, o bien para

    lectura y escritura, lo que se hace pasando como segundo argumento de

    ambos constructores la cadena "r" o "rw", respectivamente. Lo que

    realmente distingue el acceso aleatorio es la posibilidad de movernos acualquier posicin dentro del archivo: para ello utilizamos el mtodo

  • 5/21/2018 10518_archivos aleatorios

    10/20

    seek , que nos lleva a la posicin que especifiquemos, length, que nos

    devuelve la longitud del archivo, lo que nos permite saber hasta dnde

    podemos llegar movindonos por l, y getFilePointer, que nos devuelve

    la posicin donde nos hallamos en un momento dado. Como

    conveniencia contamos tambin con el mtodo skipBytes, que nos

    permite saltarnos un nmero determinado de bytes desde la posicin

    donde nos hallemos. En cuanto al resto de los mtodos, son los que se

    podran esperar: las diversas versiones de ready writepermiten leer y

    escribir uno o ms bytes, y funcionan del mismo modo que lo hacan

    para las clases InputStream y OutputStream. Adems, tambin hay un

    mtodo closepara cerrar el archivo cuando terminemos de trabajar con

    l. Tambin hay un gran nmero de mtodos con nombres como

    readDouble, readInt, writeDouble, writeInt , etc., que sirven para leer y

    escribir de forma portable los diversos tipos de datos predefinidos.

    Recurdese que las clases InputDataStreamy OutputDataStreamtenan

    mtodos con el mismo nombre y el mismo propsito.

    2. Ejemplos en java:

    2.1. // Una clase q ue representa un registro de informacin.

    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 reg ist ro

    public RegistroCuentas( int cta, String nombre, String apellido, double sald

    )

    {

    establecerCuenta( cta );

    establecerPrimerNombre( nombre );

    establecerApellidoPaterno( apellido );

    establecerSaldo( sald );}

  • 5/21/2018 10518_archivos aleatorios

    11/20

    // Establecer nmero de cuenta

    public void establecerCuenta( int cta )

    {

    cuenta = cta;

    }

    // Obtener nmero de cuenta

    public int obtenerCuenta()

    {

    return cuenta;

    }

    // Establecer p rimer nombre

    public void establecerPrimerNombre( String nombre )

    {

    primerNombre = nombre;

    }

    // Obtener p rimer 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 Regist roCuentas

  • 5/21/2018 10518_archivos aleatorios

    12/20

    2.2. // Esta clase d eclara mtodos para manipular los registros de una

    cuenta de banco en un archivo de acceso aleato rio.

    import java.io.*;

    public class EditorArchivo {

    RandomAccessF ile archivo; // referencia al archiv

    // Abrir el archi vo

    public EditorArchivo( File nombreArchivo ) throws IOException

    {

    archivo = new RandomAccessF ile( nombreArchivo, "rw" );

    }

    // Cerrar el archivo

    public void cerrarArchivo() throws IOException

    {

    if ( archivo != null )

    archivo.close();

    }

    // Obtener un reg istro del archivo

    public RegistroCuentasAccesoAleatorio obtenerRegistro( intnumeroCuenta )

    throws IllegalArgumentException, NumberFormatException, IOException

    {

    RegistroCuentasAccesoAleatorio registro = newRegistroCuentasAccesoAleatorio();

    if ( numeroCuenta < 1 | | numeroCuenta > 100 )

    throw new IllegalArgumentException( "Fuera de rango" );

    // Buscar reg istro apropiado en el archivo

    archivo.seek( ( numeroCuenta - 1 ) *RegistroCuentasAccesoAleatorio.TAMANIO ) ;

    registro.leer( archivo );

    return registro; }

    // Fin del mtodo obtenerRegistro

  • 5/21/2018 10518_archivos aleatorios

    13/20

    // Actualizar regist ro en el archivo

    public void actualizarRegistro( int numeroCuenta, String primerNombre,

    String apellidoPaterno, double saldo )

    throws IllegalArgumentException, IOException

    {

    RegistroCuentasAccesoAleatorio registro = obtenerRegistro(numeroCuenta );

    if ( numeroCuenta == 0 )

    throw new IllegalArgumentException( "La cuenta no existe" );

    // Buscar reg istro apropiado en el archivo

    archivo.seek( ( numeroCuenta - 1 ) *RegistroCuentasAccesoAleatorio.TAMANIO ) ;

    registro = new RegistroCuentasAccesoAl eatorio( numeroCuenta,

    primerNombre, apellidoPaterno, saldo );

    registro.escribir( archivo ); // escrib ir regist ro actualizado en elarchivo

    } // Fin del mtodo actualizarReg istro

    // Agregar regist ro al archivo

    public void nuevoRegistro( int numeroCuenta, String primerNombre,

    String apellidoPaterno, double saldo )

    throws IllegalArgumentException, IOException

    {

    RegistroCuentasAccesoAleatorio registro = obtenerRegistro(numeroCuenta );

    if ( registro.obtenerCuenta() != 0 )

    throw new IllegalArgumentException( "La cuenta ya existe" );

    // Buscar reg istro apropiado en el archivo

    archivo.seek( ( numeroCuenta - 1 ) *RegistroCuentasAccesoAleatorio.TAMANIO ) ;

    registro = new RegistroCuentasAccesoAl eatorio( numeroCuenta,

  • 5/21/2018 10518_archivos aleatorios

    14/20

    primerNombre, apellidoPaterno, saldo );

    registro.escribir( archivo ); // escribir reg ist ro en el archivo

    } // Fin del mtodo nuevoRegistro

    // Eliminar reg istro del archivo

    public void eliminarRegistro( int numeroCuenta )

    throws IllegalArgumentException, IOException

    {

    RegistroCuentasAccesoAleatorio registro = obtenerRegistro(numeroCuenta );

    if ( registro.obtenerCuenta() == 0 )

    throw new IllegalArgumentException( "La cuenta no existe" );

    // Buscar reg istro apropiado en el archivo

    archivo.seek( ( numeroCuenta - 1 ) *RegistroCuentasAccesoAleatorio.TAMANIO ) ;

    // crear un registro en blanco para escribir en el archivo

    registro = new RegistroCuentasAccesoAl eatorio();registro.escribir( archivo );

    } // Fin del mtodo eliminarRegistro

    } // Fin de la clase EditorArchivo

    2.3. // Una clase q ue representa un registro de informacin.

    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 valorespredeterminados

    public RegistroCuentas()

    { this( 0, "", "", 0.0 );

  • 5/21/2018 10518_archivos aleatorios

    15/20

    }

    // Inicializar un registropublic RegistroCuentas( int cta, String nombre, String apellido, double sald ){

    establecerCuenta( cta );establecerPrimerNombre( nombre );establecerApellidoPaterno( apellido );establecerSaldo( sald );

    }

    // Establecer nmero de cuentapublic void establecerCuenta( int cta ){

    cuenta = cta;}

    // Obtener nmero de cuentapublic int obtenerCuenta(){

    return cuenta;}

    // Establecer primer nombrepublic void establecerPrimerNombre( String nombre ){

    primerNombre = nombre;}

    // Obtener pr imer nombrepublic String obtenerPrimerNombre(){

    return primerNombre;}

    // Establecer apellido paternopublic void establecerApellidoPaterno( String apellido )

    { apellidoPaterno = apellido;}

    // Obtener apellido paternopublic String obtenerApellidoPaterno(){

    return apellidoPaterno;}

    // Establecer saldo

    public void establecerSaldo( double sald ){

  • 5/21/2018 10518_archivos aleatorios

    16/20

    saldo = sald;}

    // obtener saldopublic double obtenerSaldo()

    {return saldo;

    }

    }// Fin de la clase Regist roCuentas

    2.3.1. // Subclase de Regist roCuentas para lo s programas que usanarchivos de acceso aleatorio.

    import java.io.*;

    public class RegistroCuentasAccesoAleatorio extends RegistroCuentas {

    public static final int TAMANIO = 72;

    // El constructor sin argumentos llama al otro constructo r con los valorespredeterminados

    public RegistroCuentasAccesoAl eatorio()

    {

    this( 0, "", "", 0.0 );

    }

    // Inicializar un objeto RegistroCuentasAccesoAleatorio

    public RegistroCuentasAccesoAl eatorio( 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 ) );

  • 5/21/2018 10518_archivos aleatorios

    17/20

    establecerApellidoPaterno( leerNombre( archivo ) );

    establecerSaldo( archivo.readDouble() );

    }

    // Asegurarse que el no mbre sea de la longitud apropiada

    private String leerNombre( RandomAccessF ile 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', ' ' );

    }

    // Escrib ir un registro en el ob jeto RandomAccessFile especificado

    public void escribir( RandomAccessFile archivo ) throws IOException

    {

    archivo.writeInt( obtenerCuenta() );

    escribirNombre( archivo, obtenerPrimerNombre() );

    escribirNombre( archivo, obtenerApellidoPaterno() );

    archivo.writeDouble( obtenerSaldo() );

    }

    // Escrib ir un nombre en el archi vo; mximo 15 caracteres

    private void escribirNombre( RandomAccessFile archivo, String nombre )

    throws IOException

    {

    StringBuffer bufer = null;

    if ( nombre != null )

    bufer = new StringBuffer( nombre );

    else

  • 5/21/2018 10518_archivos aleatorios

    18/20

    bufer = new StringBuffer( 15 );

    bufer.setLength( 15 );

    archivo.writeChars( bufer.toString() );

    }

  • 5/21/2018 10518_archivos aleatorios

    19/20

    Conclusin

    En la anterior investigacin desarrollamos una temtica de gran importancia,

    que nos permite hacer ms extenso nuestro conocimiento para el uso y

    manejo de aplicaciones en java, establecimos que son los archivos aleatorios,

    como su funcionan y algunos ejemplos. Esto nos permiti aprender una nueva

    forma de utilizacin y aprovechamiento de java, al igual que resaltar algo

    importante:

    Lo que realmente distingue el acceso aleatorio es la posibilidad de

    movernos a cualquier posicin dentro del archivo: para ello utilizamos el

    mtodo seek , que nos lleva a la posicin que especifiquemos, length, que

    nos devuelve la longitud del archivo, lo que nos permite saber hasta dnde

    podemos llegar movindonos por l, y getFilePointer, que nos devuelve la

    posicin donde nos hallamos en un momento dado.

    La clase Files es ms til: un detalle importante a tener en cuenta es que

    esta clase no solo representa archivos, sino tambin directorios.

    Con la investigacin y consecucin de este trabajo nuestro grupo resalta la

    importancia que tiene en el desarrollo de la vida empresarial y vanguardista el

    conocer el manejo y utilizacin de la programacin en java, ya que esta

    herramienta nos permite ser ms eficaces y competitivos en un mundo tan

    evolucionado como el de hoy, creando aplicaciones que mejoran nuestro estilo

    de trabajo.

  • 5/21/2018 10518_archivos aleatorios

    20/20

    Bibliografa

    http://www.mundote.info/Foro/manuales-y-libros/tutorial-vb6-(manejo-de-

    archivos)/?PHPSESSID=a7ee26a74b3f32659865ea628057ca65

    http://delfosis.uam.mx/~sgb/Archivos/Excepciones_y_archivos.html

    http://www.softwarementors.com/arti/java_io/java_io2.htm

    C:\Documents and Setti ngs\Administrador\Escritorio\Manejo de Archivos en

    Java.htm