WrappedOutputStreampublic 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. |
Fields Summary |
---|
public static final int | DEFAULT_BUFFER_SIZEDefault buffer size (1024). | protected byte[] | fBufferBuffer. | protected int | fPositionBuffer position. | protected DataOutputStream | fDataOutputStreamData 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 void | close()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 void | flush()Flushes the output buffer, writing all bytes currently in
the buffer to the output.
flush0();
super.out.flush();
| public void | flush0()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 void | write(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 void | write(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);
|
|