Está en la página 1de 8

package accesodirecto;

public class CPersona


{
private String nombre;
private String direccion;
private long telefono;
public CPersona() {}
public CPersona(String nom, String dir, long tel) {
nombre = nom;
direccion = dir;
telefono = tel;
}
public void asignarNombre(String nom) {
nombre = nom;
}
public String obtenerNombre() {
return nombre;
}
public void asignarDireccion(String dir) {
direccion = dir;
}
public String obtenerDireccion() {
return direccion;
}
public void asignarTelefono(long tel) {
telefono = tel;
}
public long obtenerTelefono() {
return telefono;
}
public int tamanio() {
// Longitud en bytes de los atributos (un Long = 8 bytes)
return nombre.length()*2 + direccion.length()*2 + 8;
}
}

package accesodirecto;

import java.io.*;
public class CListaTfnos {
private RandomAccessFile fes; // flujo
private int nregs;
// numero de registros
private int tamanioReg = 140; // tamao del registro en bytes
public CListaTfnos(File fichero) throws IOException {
if (fichero.exists() && !fichero.isFile())
throw new IOException(fichero.getName() + " no es un fichero");
fes = new RandomAccessFile(fichero, "rw");
// Como es casi seguro que el ultimo registro no ocupe el
// tamao fijado, utilizamos ceil para redondear por encima.
System.out.println("(double)fes.length():" + (double)fes.length());
System.out.println("(double)tamanioReg:" + (double)tamanioReg);
System.out.println("(int)Math.ceil((double)fes.length() /
(double)tamanioReg)" +
(int)Math.ceil((double)fes.length() /
(double)tamanioReg));
nregs = (int)Math.ceil((double)fes.length() / (double)tamanioReg);
//
System.out.println("nregs:" + nregs);
}
public void cerrar() throws IOException { fes.close(); }
public int longitud() { return nregs; } // numero de registros
public boolean ponerValorEn( int i, CPersona objeto ) throws IOException {
if (i >= 0 && i <= nregs)
{
if (objeto.tamanio() + 4 > tamanioReg)
System.err.println("tamanio del registro excedido");
else
{
fes.seek(i * tamanioReg); // situar el puntero de L/E
fes.writeUTF(objeto.obtenerNombre());
fes.writeUTF(objeto.obtenerDireccion());
fes.writeLong(objeto.obtenerTelefono());
return true;
}
}
else
System.err.println("numero de registro fuera de limites");
return false;
}
public CPersona valorEn( int i ) throws IOException {
if (i >= 0 && i < nregs)
{
fes.seek(i * tamanioReg); // situar el puntero de L/E
String nombre, direccion;
long telefono;
nombre = fes.readUTF();
2

direccion = fes.readUTF();
telefono = fes.readLong();
return new CPersona(nombre, direccion, telefono);
}
else
{
System.out.println("numero de registro fuera de limites");
return null;
}
}
public void aniadir(CPersona obj) throws IOException {
if (ponerValorEn( nregs, obj )) nregs++;
}
public boolean eliminar(long tel) throws IOException {
CPersona obj;
// Buscar el telefono y marcar el registro para
// posteriormente eliminarlo
for ( int reg_i = 0; reg_i < nregs; reg_i++ ) {
obj = valorEn(reg_i);
if (obj.obtenerTelefono() == tel) {
obj.asignarTelefono(0);
ponerValorEn( reg_i, obj );
return true;
}
}
return false;
}
public int buscar(String str, int pos) throws IOException {
// Buscar un registro por una subcadena del nombre
// a partir de un registro determinado
CPersona obj;
String nom;
if (str == null) return -1;
if (pos < 0) pos = 0;
for ( int reg_i = pos; reg_i < nregs; reg_i++ ) {
obj = valorEn(reg_i);
nom = obj.obtenerNombre();
// str est contenida en nom?
if (nom.indexOf(str) > -1)
return reg_i;
}
return -1;
}
}
package accesodirecto;
import java.io.*;
//////////////////////////////////////////////////////////////////
// Aplicacion para trabajar con un fichero accedido aleatoriamente
3

//
public class Test {
// Definir una referencia al flujo estandar de salida: flujoS
static PrintStream flujoS = System.out;
static CListaTfnos listatfnos;
public static void imprimirListaTfnos() throws IOException {
// Crear un flujo hacia la impresora
FileWriter flujoS = new FileWriter("LPT1");
String crlf = "\r\n"; // cambiar a la siguiente linea
String ff = "\f";
// saltar a la siguiente pagina
Integer i;
// referencia a un objeto Integer
Long l;
// referencia a un objeto Long
int nregs = listatfnos.longitud(); // numero de registros
for (int n = 0; n < nregs; n++) {
// Saltar pagina inicialmente y despues cada 60 lineas
if (n % 60 == 0) flujoS.write(ff);
// Imprimir el registro n de la lista de telefonos
i = new Integer(n); // numero de registro
flujoS.write("Registro: " + i.toString() + crlf);
flujoS.write(listatfnos.valorEn(n).obtenerNombre() + crlf);
flujoS.write(listatfnos.valorEn(n).obtenerDireccion() + crlf);
l = new Long(listatfnos.valorEn(n).obtenerTelefono());
flujoS.write(l.toString() + crlf);
flujoS.write(crlf); // saltar una linea
}
flujoS.write(ff); // saltar a la siguiente pagina
flujoS.close(); // cerrar el flujo hacia la impresora
}
public static boolean modificar(int nreg) throws IOException {
String nombre, direccion;
long telefono;
int op;
// Leer el registro
CPersona obj = listatfnos.valorEn(nreg);
if (obj == null) return false;

// Modificar el registro
do
{
flujoS.print("\n\n");
flujoS.println("Modificar el dato:");
flujoS.println("1. Nombre");
flujoS.println("2. Direccion");
4

flujoS.println("3. Telefono");
flujoS.println("4. Salir y salvar los cambios");
flujoS.println("5. Salir sin salvar los cambios");
flujoS.println();
flujoS.print(" Opcion: ");
op = Leer.datoInt();
switch( op )
{
case 1: // modificar nombre
flujoS.print("nombre: ");
nombre = Leer.dato();
obj.asignarNombre(nombre);
break;
case 2: // modificar direccion
flujoS.print("direccion: ");
direccion = Leer.dato();
obj.asignarDireccion(direccion);
break;
case 3: // modificar telefono
flujoS.print("telefono: ");
telefono = Leer.datoLong();
obj.asignarTelefono(telefono);
break;
case 4: // guardar los cambios
break;
case 5: // salir sin guardar los cambios
break;
}
}
while( op != 4 && op != 5);
if (op == 4)
{
listatfnos.ponerValorEn(nreg, obj);
return true;
}
else
return false;
}
public static void actualizar(File fActual) throws IOException
{ // Crear un fichero temporal
File ficheroTemp = new File("listatfnos.tmp");
CListaTfnos ftemp = new CListaTfnos(ficheroTemp);
int nregs = listatfnos.longitud();
// Copiar en el fichero temporal todos los registros del
// fichero actual que en su campo telefono no tengan un 0
CPersona obj;
for ( int reg_i = 0; reg_i < nregs; reg_i++ )
{
obj = listatfnos.valorEn(reg_i);
if (obj.obtenerTelefono() != 0)
ftemp.aniadir(obj);
5

}
listatfnos.cerrar();
ftemp.cerrar();
fActual.delete();
if (!ficheroTemp.renameTo(fActual))
throw new IOException("no se renombr el fichero");
}
public static int menu()
{
flujoS.print("\n\n");
flujoS.println("1. Buscar");
flujoS.println("2. Buscar siguiente");
flujoS.println("3. Modificar");
flujoS.println("4. Aadir");
flujoS.println("5. Eliminar");
flujoS.println("6. Imprimir");
flujoS.println("7. Salir");
flujoS.println();
flujoS.print(" Opcion: ");
int op;
do
op = Leer.datoInt();
while (op < 1 || op > 7);
return op;
}
public static void main(String[] args)
{
int opcion = 0, pos = -1;
String cadenabuscar = null;
String nombre, direccion;
long telefono;
boolean eliminado = false;
boolean modificado = false;
try
{
// Crear un objeto lista de telefonos vacio (con 0 elementos)
// o con el contenido del fichero listatfnos.dat si existe.
File fichero = new File("listatfnos.dat");
listatfnos = new CListaTfnos(fichero);
do
{
opcion = menu();
switch (opcion)
{
case 1: // buscar
flujoS.print("conjunto de caracteres a buscar ");
cadenabuscar = Leer.dato();
pos = listatfnos.buscar(cadenabuscar, 0);
if (pos == -1)
6

if (listatfnos.longitud() != 0)
flujoS.println("busqueda fallida");
else
flujoS.println("lista vacia");
else
{
flujoS.println("Numero de registro: " + pos);
flujoS.println(listatfnos.valorEn(pos).obtenerNombre());
flujoS.println(listatfnos.valorEn(pos).obtenerDireccion());
flujoS.println(listatfnos.valorEn(pos).obtenerTelefono());
}
break;
case 2: // buscar siguiente
pos = listatfnos.buscar(cadenabuscar, pos + 1);
if (pos == -1)
if (listatfnos.longitud() != 0)
flujoS.println("busqueda fallida");
else
flujoS.println("lista vacia");
else
{
flujoS.println("Numero de registro: " + pos);
flujoS.println(listatfnos.valorEn(pos).obtenerNombre());
flujoS.println(listatfnos.valorEn(pos).obtenerDireccion());
flujoS.println(listatfnos.valorEn(pos).obtenerTelefono());
}
break;
case 3: // modificar
// Solicitar el numero de registro a modificar
flujoS.print("numero de registro entre 0 y " +
(listatfnos.longitud() - 1) + ": ");
pos = Leer.datoInt();
modificado = modificar(pos);
if (modificado)
flujoS.println("modificacion realizada con exito");
else
flujoS.println("error: no se modifico el registro");
break;
case 4: // aadir
flujoS.print("nombre: "); nombre = Leer.dato();
flujoS.print("direccion: "); direccion = Leer.dato();
flujoS.print("telefono: "); telefono = Leer.datoLong();
listatfnos.aniadir(new CPersona(nombre, direccion, telefono));
break;
case 5: // eliminar
flujoS.print("telefono: "); telefono = Leer.datoLong();
eliminado = listatfnos.eliminar(telefono);
if (eliminado)
flujoS.println("registro eliminado");
else
if (listatfnos.longitud() != 0)
flujoS.println("telefono no encontrado");
else
7

flujoS.println("lista vacia");
break;
case 6: // imprimir
imprimirListaTfnos();
break;
case 7: // salir
// guardar lista
if (eliminado) actualizar(fichero);
listatfnos = null;
}
}
while(opcion != 7);
}
catch (IOException e)
{
flujoS.println("Error: " + e.getMessage());
}
}
}

También podría gustarte