Javadoc
PartialBufferedOutputStream
Oct 19, 2005
Purpose:
I have modelled this class after the BufferedOutputStream. Several methods are synchronized as a
result. The interior of this class uses a ByteArrayOutputStream when it starts and then a
BufferedOutputStream. This is essentially a decorator. This class uses a temporary to-memory
OutputStream for initial bufferring. This OutputStream is a ByteArrayOutputStream. Once a
pre-defined BUFFER_SIZE has been reached, the output that is stored in the ByteArrayOutputStream
is output to the real OutputStream to the response. Further data is then written to that response
OutputStream. For the first run of this, we will write to memory for the buffered part. Writing
to disk is another option. NOTE: If we switch to writing out to disk, we will have to clean up
our temporary files with abort(). WARNING: IF you abuse the size of the buffer, you may leak
memory if this OutputStream is not terminated. The ByteArrayOutputStream will hold onto its
allocated memory even after you call reset() on it. So if you put in 60MB of buffer space, it
will stay there until the object is no longer referenced and the garbage collector decides to
pick it up. A solution to this would be to use a FileOutputStream instead of the
ByteArrayOutputStream. CONTRACT: -close() will NOT flush remaining bytes to the output stream, as
per the contract with OutputStream. Close will remove any references to OutputStreams and its
HttpServletResponse. -fush() will NOT flush if the buffer is not full. -abort() will succeed if
the buffer is not full yet. If the buffer has been filled and the information has been written
out to response's OutputStream, the abort reports as having failed. The point of this
PartialBufferedOutputStream is to allow an abort before the information has been written out to
the real OutputStream. When abort is called the references to any OutputStreams and the
HttpServletResponse are removed.