FileDocCategorySizeDatePackage
WrappedOutputStream.javaAPI DocApache Xerces 3.0.15932Fri Sep 14 20:33:56 BST 2007socket.io

WrappedOutputStream

public class WrappedOutputStream extends FilterOutputStream
This output stream works in conjunction with the WrappedInputStream to introduce a protocol for sending arbitrary length data in a uniform way. This output stream allows variable length data to be inserted into an existing output stream so that it can be read by an input stream without reading too many bytes (in case of buffering by the input stream).

This output stream is used like any normal output stream. The protocol is introduced by the WrappedOutputStream and does not need to be known by the user of this class. However, for those that are interested, the method is described below.

The output stream writes the requested bytes as packets of binary information. The packet consists of a header and payload. The header is two bytes of a single unsigned short (written in network order) that specifies the length of bytes in the payload. A header value of 0 indicates that the stream is "closed".

Note: For this wrapped output stream to be used, the application must call close() to end the output.

see
WrappedInputStream
author
Andy Clark, IBM
version
$Id: WrappedOutputStream.java 447688 2006-09-19 02:39:49Z mrglavas $

Fields Summary
public static final int
DEFAULT_BUFFER_SIZE
Default buffer size (1024).
protected byte[]
fBuffer
Buffer.
protected int
fPosition
Buffer position.
protected DataOutputStream
fDataOutputStream
Data output stream. This stream is used to output the block sizes into the data stream that are read by the WrappedInputStream.

Note: The data output stream is only used for writing the byte count for performance reasons. We avoid the method indirection for writing the byte data.

Constructors Summary
public WrappedOutputStream(OutputStream stream)
Constructs a wrapper for the given output stream.


    //
    // Constructors
    //

             
       
        this(stream, DEFAULT_BUFFER_SIZE);
    
public WrappedOutputStream(OutputStream stream, int bufferSize)
Constructs a wrapper for the given output stream with the given buffer size.

        super(stream);
        fBuffer = new byte[bufferSize];
        fDataOutputStream = new DataOutputStream(stream);
    
Methods Summary
public voidclose()
Closes the output stream. This method must be called when done writing all data to the output stream.

Note: This method does not close the actual output stream, only makes the input stream see the stream closed. Do not write bytes after closing the output stream.

        flush0();
        fDataOutputStream.writeInt(0);
        super.out.flush();
    
public voidflush()
Flushes the output buffer, writing all bytes currently in the buffer to the output.

        flush0();
        super.out.flush();
    
public voidflush0()
Flushes the output buffer, writing all bytes currently in the buffer to the output. This method does not call the flush() method of the output stream; it merely writes the remaining bytes in the buffer.

        int length = fPosition;
        fPosition = 0;
        if (length > 0) {
            fDataOutputStream.writeInt(length);
            super.out.write(fBuffer, 0, length);
        }
    
public voidwrite(int b)
Writes a single byte to the output.

Note: Single bytes written to the output stream will be buffered

        fBuffer[fPosition++] = (byte)b;
        if (fPosition == fBuffer.length) {
            fPosition = 0;
            fDataOutputStream.writeInt(fBuffer.length);
            super.out.write(fBuffer, 0, fBuffer.length);
        }
    
public voidwrite(byte[] b, int offset, int length)
Writes an array of bytes to the output.


        // flush existing buffer
        if (fPosition > 0) {
            flush0();
        }

        // write header followed by actual bytes
        fDataOutputStream.writeInt(length);
        super.out.write(b, offset, length);