Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Versión: 1.0
I. OBJETIVOS:
Que el estudiante sea capaz de:
Implementar las clases definidas en el lenguaje de programación para la
construcción de aplicaciones que permiten escribir y leer datos de tipo primitivo
en un archivo de acceso aleatorio.
Para que la búsqueda sea efectiva, los registros guardados deben tener el mismo
tamaño, de esta manera el cálculo de la posición de cada registro se calcularía
de la siguiente manera:
RandomAccessFile
RandomAccessFile
Constructores
Crea un flujo de acceso directo al archivo especificado por filename para leer
y opcionalmente escribir. La variable mode hace referencia al modo del
archivo si se le pasa “r” el archivos será de solo lectura, si se le pasa “rw” el
archivo será de lectura y escritura.
Crea un flujo de acceso directo al archivo especificado por el objeto file para
leer y escribir. La variable mode hace referencia al modo del archivo si se le
pasa “r” el archivos será de solo lectura, si se le pasa “rw” el archivo será de
lectura y escritura.
Métodos
long getFilePointer()
long length()
int read(byte[ ] b)
UNIVERSIDAD NACIONAL DE INGENIERÍA
FACULTAD DE CIENCIAS Y SISTEMAS
DEPARTAMENTO DE INFORMÁTICA
Lee un número de bytes de datos desde el flujo de entrada y los almacena en
el arreglo de bytes “b”. Devuelve los bytes leídos.
Lee desde una posición “off” hasta “size” bytes de datos desde el flujo de
entrada y los almacena en el arreglo de bytes “b”. Devuelve los bytes leídos.
boolean readBoolean()
byte readByte()
char readChar()
double readDouble()
float readFloat()
int readInt()
long readLong()
short readShort()
String readUTF()
Lee una cadena que ha sido codificada usando el formato UTF-8 modificado.
seek(long pos)
write(int b)
Escribe el byte especificado (los ocho bits bajos del argumento b) hacia el flujo
de salida de archivo
writeBoolean(boolean v)
writeByte(int v)
writeBytes(String s)
Escribe la cadena “s” byte hacia el flujo de datos de salida como una secuencia
de bytes.
writeChar(char v)
writeChars(String s)
Escribe la cadena “s” hacia el flujo de datos de salida como una secuencia de
caracteres.
writeDouble(double v)
writeFloat(float v)
Escribe el valor entero “v” ” hacia el flujo de datos de salida como 4 bytes,
comenzando por el byte alto.
writeLong(long v)
Escribe el valor long “v” ” hacia el flujo de datos de salida como 8 bytes,
comenzando por el byte alto.
writeShort(int v)
Escribe el valor short “v” ” hacia el flujo de datos de salida como 2 bytes,
comenzando por el byte alto.
writeUTF(String str)
if (!file.exists()) {
file.createNewFile ();
raf = new RandomAccessFile(file, "rw");
raf.seek (0);
raf.writeInt (0);
raf.writeInt (0);
} else {
raf = new RandomAccessFile(file, "rw");
}
}
UNIVERSIDAD NACIONAL DE INGENIERÍA
FACULTAD DE CIENCIAS Y SISTEMAS
DEPARTAMENTO DE INFORMÁTICA
En el método openRAF (), observe que se declara en la definición del método el
relanzamiento de la excepcion IOException en caso que haya un error de ese
tipo.
En caso que el archivo ya existe solo se instancia la variable raf que representa
un objeto de la clase RandomAccessFile.
Ya podemos usar el objeto raf para llamar los métodos de lectura, escritura,
obtener la posición del puntero y mover el mismo hacia una nueva posición.
Ejemplo:
En el siguiente ejemplo se pretende guardar la información de un estudiante,
tales como nombres, apellidos, número de carnet y edad. Cada uno será un
registro guardado en un archivo aleatorio. Para ello se creara un objeto de la
clase RandomAccessFile. Además se utilizara el patrón de diseño llamado
DAO.
Hay que recordar que para que el archivo aleatorio sea efectivo los registros
deben tener el mismo tamaño. Para calcular el estimado de bytes de cada
UNIVERSIDAD NACIONAL DE INGENIERÍA
FACULTAD DE CIENCIAS Y SISTEMAS
DEPARTAMENTO DE INFORMÁTICA
registro se toman cada variable del objeto a guardar, en este caso se obtendrían
las del objeto Estudiante, los campos serian:
id int 4 bytes
~20 caracteres
subtotal = 43 bytes
~20 caracteres
subtotal = 43 bytes
~10 caracteres
subtotal = 23 bytes
Primero se crea la clase POJO (Plain Old Java Object, Objeto Java Simple)
public Estudiante() {
}
public Estudiante(int id, String nombres, String apellidos, String carnet, int edad) {
this.id = id;
this.nombres = nombres;
this.apellidos = apellidos;
this.carnet = carnet;
this.edad = edad;
}
Se crea la interfaz Model, se declaran los métodos básicos para la gestión de los
registros de Estudiante en el archivo, como son: Salvar un nuevo registro,
actualizar, eliminar y regresar todos los estudiantes guardados.
import java.io.IOException;
import java.io.IOException;
import java.io.File;
UNIVERSIDAD NACIONAL DE INGENIERÍA
FACULTAD DE CIENCIAS Y SISTEMAS
DEPARTAMENTO DE INFORMÁTICA
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.Arrays;
import pojo.Estudiante;
public EstudianteModelImpl() {
path = "base.dat";
file = new File(path);
}
@Override
public Estudiante findByCarnet(String carnet) throws IOException {
return null;
}
UNIVERSIDAD NACIONAL DE INGENIERÍA
FACULTAD DE CIENCIAS Y SISTEMAS
DEPARTAMENTO DE INFORMÁTICA
@Override
public Estudiante[] findByLastname(String lastname) throws IOException {
Estudiante[] arr=findAll();
Estudiante[] founds=null;
int l, r, key;
Arrays.sort(arr,
(Estudiante t, Estudiante t1)->t.getLastnames().compareToIgnoreCase(t1.getLastnames()));
key=Arrays.binarySearch(arr, new Estudiante(0,null, null, lastname, 0),
(Estudiante t, Estudiante t1)->t.getLastnames().compareToIgnoreCase(t1.getLastnames()));
if(key>=0){
l=r=key;
while(--l>=0){
if(arr[l].getLastnames().equalsIgnoreCase(lastname)){
founds=addElement(founds, arr[l]);
}else{
break;
}
}
founds=addElement(founds, arr[key]);//elemento del medio, en el medio
while(++r<arr.length) {
if (arr[r].getLastnames().equalsIgnoreCase(lastname)) {
founds = addElement(founds, arr[r]);
} else {
break;
}
}
}
return founds;//si no se encuentra nada, se retornaria NULL, por valor inicializado
}
@Override
public Estudiante[] findByAgeRange(int min, int max) throws IOException {
return null;
}
@Override
public int save(Estudiante t) throws IOException {
openRAF();
raf.seek(0);
int n = raf.readInt();
int k = raf.readInt();
raf.seek(0);
raf.writeInt(++n);
raf.writeInt(k);
closeRAF();
return 1;
}
if (text == null) {
sb = new StringBuilder(capacity);
} else {
sb = new StringBuilder(text);
sb.setLength(capacity);
}
return sb.toString();
}
@Override
public Estudiante findById(int id) throws IOException {
Estudiante e = null;
openRAF();
raf.seek(0);
int n = raf.readInt();
@Override
public boolean update(Estudiante t) throws IOException {
int id=t.getId();
openRAF();
raf.seek(0);
int n=raf.readInt();
if(id<=0||id>n){
closeRAF();
return false;
}
long pos=8+(id-1)*SIZE;
raf.seek(pos);
int code=raf.readInt();//el id no se cambia
if(code==id){
raf.writeUTF(fixString(t.getCarnet(), 10));
raf.writeUTF(fixString(t.getNames(), 20));
raf.writeUTF(fixString(t.getLastnames(), 20));
raf.writeInt(t.getAge());
closeRAF();
return true;
}
closeRAF();
return false;
}
@Override
public boolean delete(Estudiante t) throws IOException {
}
@Override
public Estudiante[] findAll() throws IOException {
Estudiante estudiantes[] = null;
openRAF();
raf.seek(0);
int n = raf.readInt();
Estudiante e;
for (int i = 0; i < n; i++) {
long pos = 8 + i * SIZE;
raf.seek(pos);
e = new Estudiante();
e.setId(raf.readInt());
e.setCarnet(raf.readUTF());
e.setNames(raf.readUTF());
e.setLastnames(raf.readUTF());
e.setAge(raf.readInt());
UNIVERSIDAD NACIONAL DE INGENIERÍA
FACULTAD DE CIENCIAS Y SISTEMAS
DEPARTAMENTO DE INFORMÁTICA
estudiantes = addElement(estudiantes, e);
}
closeRAF();
return estudiantes;
}
Finalmente se escribe la clase que contiene el método main, el cual nos permitirá
ejecutar la aplicación.
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;
import model.EstudianteModelImpl;
import pojo.Estudiante;
/**
*
* @author Sistema
*/
public class RandomApp {
Ejecución
Links de descarga:
Ejercicio 1:
Implementar los métodos que no se implementaron en el ejemplo, los cuales son:
editar estudiante, eliminar estudiante, buscar por nombre, apellidos, carnet y
rango de edad.
Ejercicio 2:
IV Bibliografía
Aguilar, l. J. (2011). Programacion en Java 6, Algoritmos y programacion
orientada a objetos. Mexico: McGraw Hill.
baeldung. (16 de 01 de 2018). Binary Search Algorithm in Java. Obtenido de
http://www.baeldung.com/java-binary-search
Oracle. (2017). The Java Tutorials. Obtenido de
https://docs.oracle.com/javase/tutorial/essential/io/rafs.html
Tutorialspoint. (22 de Enero de 2018). https://www.tutorialspoint.com/.
Obtenido de
https://www.tutorialspoint.com/design_pattern/data_access_object_pattern.htm
Tutorialspoint. (2018). Java.io package Tutorial. Obtenido de
https://www.tutorialspoint.com/java/io/java_io_randomaccessfile.htm