Está en la página 1de 8

RandomAccessFile Modelo IEEE 2014-2015 Adaptado para el CEII

FICHEROS DE ACCESO DIRECTO O RANDOMICOS


Jafet Glvez
jgalvezq@est.ups.edu.ec
Xavi Montero
omontero@est.ups.edu.ec



Resumen: La clase RandomAccessFile en la API
de Java IO le permite moverse en torno a un
archivo y leer de l o escribir en ella lo que quieras.
Puede reemplazar las piezas existentes de un
archivo demasiado. Esto no es posible con el
FileInputStream o FileOutputStream.
Palabras claves: RandomAccessFile, long
getFilePointer, seek, public xxx readXxx, final void
writeBytes.
ABSTRACT: The RandomAccessFile class Java
IO API allows you to move around a file and read
from it or write to it whatever you want. You can
replace existing parts of a file too . This is not
possible with the FileInputStream or
FileOutputStream.
Keywords: RandomAccessFile, long
getFilePointer, seek, public xxx readXxx, final void
writeBytes.

1 INTRODUCCIN: la clase Random
AccessFile es una de las ms importantes
para leer datos binarios, esta clase viene del
paquete java.io que a su vez significa entrada
y salida de datos. Todo objeto instanciado con
la clase RandomAccessFile tendr un puntero
y siempre iniciara desde 0 y segn como
queramos que recorra nuestro puntero ser
previamente puesto las condiciones. La
acotacin es que siempre se mide en bytes.
El argumento modo indica el modo de acceso
en el que se abre el fichero.
Los valores permitidos para este parmetro
son: r= Abre el fichero en modo solo lectura.
Una operacin de escritura en este fichero
lanzar una excepcin IOException.
rw= Abre el fichero en modo lectura y
escritura. Si el fichero no existe se crea.
La clase Random AccessFile consta de 2
constructores y 37 mtodos cuales son:
Marco terico.
RANDOM ACCESSFILE
Para la creacin necesitamos importar el
paquete java.io.RandomAccessFile luego ser
instanciado previamente como vemos en el
ejemplo:
RandomAccessFile (File objeto_fichero,
String modo)
RandomAccessFile (String nombre, String
modo)
Sus constructores funcionan de la siguiente
manera.
Tenemos el constructor que nos pide un
objeto o tan bien llamado ruta para luego ser
ledo opcional ser escrito. Tan bien consta del
segundo constructor que nos pide un nombre
en este caso sera el nombre del archivo para
ser luego ledo opcional escrito.
Excepciones que lanza el constructor:
FileNotFoundException que significa ruta no
encontrada o fallo de archivo no existe.

}

Los mtodos que contiene nuestro


try
{
RandomAccessFile raf = new
RandomAccessFile("directo.txt","rw
");
long tamao =
raf.length();
catch(Exception e)
{
System.out.println("Error de
acceso al fichero");
}
RandomAccessFile Modelo IEEE 2014-2015 Adaptado para el CEII
Los mtodos: los mtodos mas importante
tenemos los siguientes:
void seek(long posicin)
long getFilePointer()
int skipBytes(int desplazamiento)
long length()
Excepciones que lanzan los mtodos:
IOException
close(): IOException

void seek(long posicin) : no es mas que
la posicin de puntero a una posicin pos pre
terminada y su desplazamiento es mediante
bytes, comenzando desde 0 como inicio y
.lenght como el final.
.












long getFilePointer() retorna la posicin
que se encuentra tipo entero dentro del
archivo. Este mtodo devuelve el
desplazamiento desde el principio del archivo,
en bytes, en el que se produce la siguiente
lectura o escritura. Su declaracin es la
siguiente.



Un ejemplo de este mtodo seria el siguiente.






System.out.print("Introduce un
nmero entero para aadir al final
del fichero: ");
numero = sc.nextInt();
//se lee el entero a aadir en el
fichero

fichero.seek(fichero.length());
//nos situamos al final del
fichero

fichero.writeInt(numero);
//se escribe el entero

mostrarFichero();//muestra el
contenido del fichero despus de
aadir el nmero
try {
// create a new
RandomAccessFile with filename
Example
RandomAccessFile raf = new
RandomAccessFile("c:/test.txt",
"rw");

// write something in the
file
raf.writeUTF("Hello
World");

// set the file pointer at
0 position
raf.seek(0);

// read and print the
contents of the file
System.out.println("" +
raf.readUTF());

// return the file pointer
System.out.println("" +
raf.getFilePointer());










RandomAccessFile Modelo IEEE 2014-2015 Adaptado para el CEII
int skipBytes(int desplazamiento).
Desplaza el puntero desde la posicin actual,
el nmero de bytes indicado por
desplazamiento. Este mtodo puede pasar
por alto algn nmero menor de bytes,
posiblemente cero. Esto puede ser el
resultado de cualquiera de condiciones.

Este mtodo nunca lanza un EOFException.


























long length() Devuelve la longitud o
tamao del fichero en bytes, devuelve la
longitud del archivo definido por esta va de
acceso abstracta. El valor de retorno no se
especifica si este ruta de acceso define un
directorio.



try {
// create a new
RandomAccessFile with
filename test
RandomAccessFile raf
= new
RandomAccessFile("c:/test.txt
", "rw");

// write something
in the file
raf.writeUTF("Hello
World");

// set the file
pointer at 0 position
raf.seek(0);

// print the string

System.out.println("" +
raf.readUTF());

// set the file
pointer at 0 position
raf.seek(0);

// attempt to skip
10 bytes and print the number
of bytes skipped

System.out.println("" +
raf.skipBytes(10));

// print what is
left after skipping

System.out.println("" +
raf.readLine());

// set the file
pointer to position 8
raf.seek(8);

// attempt to skip
10 more bytes and print the
number of bytes skipped

System.out.println("" +
raf.skipBytes(10));
} catch (IOException
ex) {

ex.printStackTrace();
}

try{
// create new file
f = new
File("c:/test.txt")
// true if the file path
is a file, else fals
bool = f.exists();
// if path exists
if(bool)
{ // returns the length
in bytes
len = f.length();

// path
path = f.getPath();

// print

System.out.print(path+" file
length: "+len);
}
}catch(Exception e){
// if any error occurs
e.printStackTrace();
}
}



}
RandomAccessFile Modelo IEEE 2014-2015 Adaptado para el CEII
Proyecto
tenemos una pequea clase de persona con
codigo, nombre, apellido, codigo, edad
sueldo. Con lo cual es guardado con
RandomAccessFile

En el boton guardar contine lo siguiente




















El botn listar consta de lo siguiente

private void
jButton1ActionPerformed(java.awt.ev
ent.ActionEvent evt) {

int codigo =
Integer.parseInt(
Jcodigo.getText());
String nombre =
Jnombre.getText();
String apellido =
Japellido.getText();
int edad =
Integer.parseInt( Jedad.getText());
double sueldo =
Double.parseDouble(Jsueldo.getText(
));

Personas p =new Personas
();

guar.escribir(nombre,
apellido, codigo, edad, sueldo);

//guar.remplazadatos(nombre,
apellido, codigo, edad, sueldo,
nuemro);
}
private void
jButton2ActionPerformed(java.awt.e
vent.ActionEvent evt) {

String a= guar.
leerArchivo();

Jlistar.setText(a);

}
// Botn buscar
private void
jButton3ActionPerformed(java.awt.e
vent.ActionEvent evt) {
int numero =
Integer.parseInt(
Jnumero.getText());



guar.getNumeroRegistro(numero);
String[] a=
guar.getNumeroRegistro(numero);
for (int i = 0;
i<=a.length-1; i++){
Jlistar1.setText(a[i]);
}
}
RandomAccessFile Modelo IEEE 2014-2015 Adaptado para el CEII
Luego de esto nos vamos ala clase
RandomAccessFile. Lo cual contiene lo
siguiente. Para lo cual esta previamente
comentado cada mtodo y su funcin


public class AcesosAleatorios {
private String ruta ;
private RandomAccessFile lecrec;
private String r="";
public
AcesosAleatorios(String ruta) {
this.ruta = ruta;
}

/**
*
* @param p
*/
public void escribir (String
nombre,String apellido,int
codigo,int edad, double sueldo){
try {
lecrec=new
RandomAccessFile(ruta,"rw");

try {
String cadena1="";
String cadena2="";
// bucle para
rellenar con espacios para que el
tamano del apellido y el nombre
siempre sean el mismo








apellido,int codigo,int edad,
double sueldo,int numero){

for(int i=0;i<20;i++){

if(i<apellido.length()){
char
e=apellido.charAt(i);

cadena2=cadena2+e;
}else{

cadena2=cadena2+" ";
}

if(i<nombre.length()){
char
e=nombre.charAt(i);

cadena1=cadena1+e;
}else{

cadena1=cadena1+" ";
}
}
lecrec.seek(numero);

lecrec.writeUTF(cadena1);

lecrec.writeUTF(cadena2);

lecrec.writeInt(codigo);

lecrec.writeInt(edad);

lecrec.writeDouble(sueldo);
lecrec.close();








} catch (IOException
e) {
RandomAccessFile Modelo IEEE 2014-2015 Adaptado para el CEII


} catch (IOException e) {
// TODO
Auto-generated catch block

e.printStackTrace();
}
} catch
(FileNotFoundException e) {
// TODO Auto-
generated catch block

e.printStackTrace();
}
}
public String
leerArchivo(){
try {
lecrec =new
RandomAccessFile(ruta,"rw");

try {
int pos=0;

while(pos<lecrec.length()){


System.out.println(pos+"
"+lecrec.length());

lecrec.seek(pos);

String nombre=
lecrec.readUTF();

String apellido=
lecrec.readUTF();

int codigo=
lecrec.readInt();



int
edad= lecrec.readInt();

double sueldo=
nt edad=
lecrec.readInt();
double
sueldo= lecrec.readDouble();

r=r+nombre+"
"+apellido+" | "+codigo+" |
"+edad+" | "+sueldo+" $ \n";
pos=pos+60;

}
} catch (IOException
e) {
// TODO Auto-
generated catch block

e.printStackTrace();
}
} catch
(FileNotFoundException e) {
// TODO Auto-
generated catch block
e.printStackTrace();


}
return r;
}

public String[]
getNumeroRegistro(int n){
n=n*60-60;
String r[]=new String[5];
try {

java.io.RandomAccessFile
ra=new
java.io.RandomAccessFile(ruta,"rw
");

try {
ra.seek(n);

RandomAccessFile Modelo IEEE 2014-2015 Adaptado para el CEII
asas































Resultados :
En este apartado trataremos de dar los
resultados para ello tenemos la pantalla de
ingreso de datos al momento de dar guardar
tendr que abrir un espacio en memoria y se
guardara en un archivo previamente
instanciado.

Listo el botn listar llama al archivo
previamente creado y llama a los datos que
tiende dentro del mismo.

Luego el botn buscar se trata de ingresar un
numero ya que cada archivo tiene una llave
as que ingresamos un numero y nos
devolver el sueldo de aquel dato ingresado
previamente
try {
ra.seek(n);

r[0]=ra.readUTF();
r[1]=
ra.readUTF();
r[2]=
ra.readInt()+"";
r[3]=
ra.readInt()+"";
r[4]=
ra.readDouble()+"";


} catch
(IOException e) {
// TODO Auto-
generated catch block

e.printStackTrace();
}

} catch
(FileNotFoundException e) {
// TODO Auto-
generated catch block

e.printStackTrace();
}

return r;
}
RandomAccessFile Modelo IEEE 2014-2015 Adaptado para el CEII



Conclusiones: esta Clase
RandomAccessFile es muy til para los
programadores. Ya que permite optimizar el
tiempo de programacin y a su vez facilita el
llamado de las mismas gracias que consta de
un puntero para buscarlos.

Bibliografa
ocw.uc3m.es. (s.f.). Obtenido de
http://ocw.uc3m.es/ingenieria-
informatica/programacion/transpare
ncias/tema9.pdf
Plaza, A., & Ortiz, M. (2012). Programacion
orientada a objets con UML y Java.
Cuenca.
tutorialspoint. (s.f.). Obtenido de
http://www.tutorialspoint.com/java/
io/datainputstream_skipbytes.htm
tutorialspoint. (s.f.). Obtenido de
http://www.tutorialspoint.com/java/
io/randomaccessfile_skipbytes.htm