10518_archivos aleatorios
-
Upload
samantha-quintas-ruiz -
Category
Documents
-
view
11 -
download
0
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