DANIEL MAZA

Página Personal

Complementando la Clase ManejoObj (Archivos)

En el artículo anterior publiqué, a manera de ejemplo, la clase ManejoObj para ser utilizada en el manejo de archivos de acceso aleatorio con objetos.

En esa clase, existe un método llamado Eliminar(String Cod), el cual marca el registro como eliminado, sin procesar la eliminación física del archivo. Para hacer efectiva la eliminación física, podemos implementar el siguiente método Regenerar(), el cual crea un archivo temporal para guardar los registros no marcados como eliminados, luego elimina el archivo original volviendolo a restaurar renombrando el archivo temporal.

public void Regenerar() throws IOException
{
        File ArchivoTemp=new File("temporal.tmp");
        ManejoObj FlujoTemp=new ManejoObj(ArchivoTemp);
        CProducto Obj;
        for(int reg_i = 0; reg_i < nregs; reg_i++)
        {
            Obj = this.ValorEn(reg_i);
            if(Obj.getCodigo().compareTo("") != 0)
               FlujoTemp.Añadir(Obj);
        }
        this.Cerrar();
        FlujoTemp.Cerrar();
        ArchivoActual.delete();
        if(!ArchivoTemp.renameTo(ArchivoActual))
            throw new IOException("No se actualizo el archivo");
}

Clase para manipular Flujos (Archivos) en Java

La Clase ManejoObj, nos permitirá manejar los flujos y las acciones sobre los registros (con objetos) y archivos. Usa instancias de la Clase CProducto como estructuras de registros.

import java.io.*;
import javax.swing.*;

public class ManejoObj {
    private RandomAccessFile FES; //flujo
    private int nregs;  //numero de registros
    private int TamañoReg=140; //tamaño del registro en bytes
    private File ArchivoActual;

    public ManejoObj(File Archivo) throws IOException
    {
        if(Archivo.exists() && !Archivo.isFile())
            throw new IOException(Archivo.getName() + "no es un Archivo Válido");
        ArchivoActual=Archivo;
        FES=new RandomAccessFile(Archivo,"rw");
        nregs=(int)Math.ceil((double) FES.length()/(double)TamañoReg);
    }
    public void Cerrar() throws IOException {FES.close();}
    public int NRegristros(){this.Mensaje(String.valueOf(nregs) + " registros"); return nregs; }

    public boolean PonerValorEn(int i,CProducto Obj) throws IOException
    {
        if(i >= 0 && i <= nregs)
        {
            if(Obj.Tamaño() + 4 > TamañoReg)
                this.Mensaje("Tamaño de registro Excedido");
            else
            {
                FES.seek(i* TamañoReg);
                FES.writeUTF(Obj.getCodigo());
                FES.writeUTF(Obj.getDescripcion());
                FES.writeFloat(Obj.getPrecio());
                return true;
            }
        }
        else
            this.Mensaje("Número de registro fuera de limites");
        return false;
    }

    public CProducto ValorEn(int i) throws IOException
    {
        if(i >= 0 && i < nregs)
        {
            FES.seek(i*TamañoReg);
            String Cod=FES.readUTF();
            String Des=FES.readUTF();
            float Pre=FES.readFloat();

            return new CProducto(Cod,Des,Pre);
        }
        else
        {
            this.Mensaje("Número de registro fuera de limites");
            return null;
        }
    }

    public void Añadir(CProducto Obj) throws IOException
    {
        if(PonerValorEn(nregs,Obj)) nregs++;
    }

    public boolean Eliminar(String Cod) throws IOException
    {
        CProducto Obj;
        for(int reg_i = 0; reg_i < nregs; reg_i++)
        {
            Obj=this.ValorEn(reg_i);
            if(Obj.getCodigo().compareToIgnoreCase(Cod)==0)
            {
                Obj.setCodigo("");
                this.PonerValorEn(reg_i, Obj);
                return true;
            }
        }
        return false;
    }

    public int Buscar(String Str, int Pos) throws IOException
    {
        CProducto Obj;
        String Cod;
        if(Str == null) return -1;
        if(Pos < 0) Pos = 0;
        for(int reg_i = Pos; reg_i < nregs; reg_i++)
        {
            Obj = this.ValorEn(reg_i);
            Cod = Obj.getCodigo();
            if(Cod.indexOf(Str) > -1)
                return reg_i;
        }
        return -1;
    }
    public void Mensaje(String msj)
    {
        JOptionPane.showMessageDialog(null, msj, "Mensaje al Usuario", JOptionPane.INFORMATION_MESSAGE);
    }
}

Clase CProducto

Esta es la clase CProducto con la cual trabajaremos los objetos para la manipulación de registros sobre archivos.

import java.io.*;
/**
 * @author Daniel F
 */
public class CProducto implements Serializable {
    String Codigo;
    String Descripcion;
    float Precio;
    public CProducto(){}
    public CProducto(String C, String D, float P)
    {
        Codigo=C;
        Descripcion=D;
        Precio=P;
    }
    public void setCodigo(String Cod)
    {
        Codigo=Cod;
    }
    public void setDescripcion(String Des)
    {
        Descripcion=Des;
    }
    public void setPrecio(float Pre)
    {
        Precio=Pre;
    }
    public String getCodigo()
    {
        return Codigo;
    }
    public String getDescripcion()
    {
        return Descripcion;
    }
    public float getPrecio()
    {
        return Precio;
    }
    public int Tamaño()
    {
        return Codigo.length()*2+Descripcion.length()*2+4;
    }
}