I/O: Leer y Escibir

Reescribamos el ejemplo de Escribir Nuestros Propios Streams Filtrados para que funcione sobre RandomAccessFiles. Como RandomAccessFile implementa los interfaces DataInput y DataOutput, un beneficio lateral es que los streams filtrados tambi�n funcionan con otros streams DataInput y DataOutput incluidos algunos streams de acceso secuencial como DataInputStream y DataOutputStream.

El ejemplo CheckedIOTest de Escribir Nuestros Propios Streams Filtrados implementa dos streams filtrados, CheckedInputStream y CheckedOutputStream, que calculan un checksum de los datos que son le�dos o escritos en el stream.

El nuevo ejemplo, CheckedDataOutput es una re-escritura de CheckedOutputStream--calcula un checksum para los datos escritos en el stream-- pero opera sobre objetos DataOutput en lugar de sobre objetos OutputStream. De forma similar CheckedDataInput modifica CheckedInputStream para que ahora funciona sobre objetos DataInput en lugar de objetos InputStream.

.�CheckedDataOutput contra CheckedOutputStream

Echemos un vistazo a las diferencias entre CheckedDataOutput y CheckedOutputStream.

La primera diferencia es que CheckedDataOutput no desciende de FilterOutputStream. En su lugar, implementa el interface DataOutput.

public class CheckedDataOutput implements DataOutput
Nota:

Para mantener el ejemplo sencillo, la clase CheckedDataOutput realmente proporcionada en esta secci�n no est� declarada para implementar DataOutput, porque el interface DataOutput especifica demasiados m�todos. Sin embargo, la clase CheckedDataOutput proporcionada en el ejemplo implementa varios m�todos de DataOutput para ilustrar como deber�an funcionar.

Luego, CheckedDataOutput declara una variable privada para contener un objeto DataOutput.

private DataOutput out;

Este es el objeto en el se escribir�n los datos.

El constructor para CheckedDataOutput es diferente del constructor de CheckedOutputStream: CheckedDataOutput se crea sobre un objeto DataOutput en vez sobre un objeto OutputStream.

public CheckedDataOutput(DataOutput out, Checksum cksum) {
    this.cksum = cksum;
    this.out = out;
}

Este constructor no llama a super(out) como hac�a el constructor de CheckedOutputStream. Esto es porque CheckedDataOutput desciende de Object en vez de la clase stream.

Aqu� est�n las �nicas modificaciones echas a CheckedOutputStream para crear un filtro que funcione sobre objetos DataOutput.

.�CheckedDataInput contra CheckedInputStream

CheckedDataInput requiere los mismos cambios que CheckedDataOuput.

  • CheckedDataInput no desciende de FilterInputStream pero implementa el interface DataInput.

    Nota:

    Para mantener el ejemplo sencillo, la clase CheckedDataInput realmente proporcionada en esta secci�n no est� declarada para implementar DataInput, porque el interface DataInput especifica demasiados m�todos. Sin embargo, la clase CheckedDataInput proporcionada en el ejemplo implementa varios m�todos de DataInput para ilustrar como deber�an funcionar.

  • CheckedDataInput declara una variable privada para contener un objeto DataInput que lo envuelve.
  • El constructor de CheckedDataInput requiere un objeto DataInput en vez de un objeto InputStream.

Adem�s de estos cambios, el m�todo read tambi�n se ha modificado. El CheckedInputStream del ejemplo original implementa dos m�todos read, uno para leer un s�lo byte y otro para leer un array de bytes. El interface DataInput teine m�todos que implementan la misma funcionalidad, pero tienen diferentes nombres y firmas de m�todos. As� el m�todo read de la clase CheckedDataInput tiene nuevos nombres y firmas de m�todos.

public byte readByte() throws IOException {
    byte b = in.readByte();
    cksum.update(b);
    return b;
}

public void readFully(byte[] b) throws IOException {
    in.readFully(b, 0, b.length);
    cksum.update(b, 0, b.length);
}

public void readFully(byte[] b, int off, int len)
    throws IOException
{
    in.readFully(b, off, len);
    cksum.update(b, off, len);
}

.�Los Programas Principales

Finalmente, este ejemplo tiene dos programas principales para probar los nuevos filtros. CheckedDITest, que ejecuta el filtro sobre ficheros de acceso secuencial (objetos DataInputStream y DataOutputStream), y CheckedRAFTest, que ejecuta los filtros sobre ficheros de acceso aleatorio (objetos RandomAccessFiles).

Estos dos programas se diferencian s�lo en el tipo del objeto que abren para el filtro. CheckedDITest crea un DataInputStream y un DataOutputStream y usa el filtro checksum sobre ellos, como en el siguiente c�digo:

cis = new CheckedDataInput(
          new DataInputStream(new FileInputStream("farrago.txt")),
	  inChecker);
cos = new CheckedDataOutput(
          new DataOutputStream(new FileOutputStream("outagain.txt")),
          outChecker);

CheckedRAFTest crea dos RandomAccessFiles, uno para leer y uno para escribir, y usa el filtro checksum sobre ellos.

cis = new CheckedDataInput(
          new RandomAccessFile("farrago.txt", "r"),
	  inChecker);
cos = new CheckedDataOutput(
          new RandomAccessFile("outagain.txt", "rw"),
          outChecker);

Cuando ejecutemos cualquiera de estos programas deber�amos ver la siguiente salida:

Input stream check sum: 736868089
Output stream check sum: 736868089

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP
ARTÍCULO ANTERIOR

SIGUIENTE ARTÍCULO