| NotifyingBufferedOutputStream.java |
/***************************************
* *
* JBoss: The OpenSource J2EE WebOS *
* *
* Distributable under LGPL license. *
* See terms of license at gnu.org. *
* *
***************************************/
package org.jboss.util.stream;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.OutputStream;
/**
* A buffered output stream that notifies every "chunk"
*
* @version <tt>$Revision: 1.2 $</tt>
* @author <a href="mailto:Adrian@jboss.org">Adrian Brock</a>
*/
public class NotifyingBufferedOutputStream
extends BufferedOutputStream
{
/**
* The number of bytes between notifications
*/
int chunkSize;
/**
* The number of bytes written in the current chunk
*/
int chunk = 0;
/**
* The listener notified every chunk
*/
StreamListener listener;
/**
* Construct a notifying buffered outputstream.<br>
* The listener is notified once every chunk.
*
* @param os the output stream to be buffered
* @param size the buffer size
* @param chunkSize the chunk size
* @exception IllegalArgumentException for a size <= 0 or chunkSize <= size or a null listener
*/
public NotifyingBufferedOutputStream(OutputStream os, int size, int chunkSize, StreamListener listener)
{
super(os, size);
if (chunkSize <= size)
throw new IllegalArgumentException("chunkSize must be bigger than the buffer");
this.chunkSize = chunkSize;
this.listener = listener;
}
public void setStreamListener(StreamListener listener)
{
this.listener = listener;
}
public void write(int b)
throws IOException
{
super.write(b);
checkNotification(1);
}
public void write(byte[] b, int off, int len)
throws IOException
{
super.write(b, off, len);
checkNotification(len);
}
/**
* Checks whether a notification is required and
* notifies as appropriate
*
* @param result the number of bytes written
*/
public void checkNotification(int result)
{
// Is a notification required?
chunk += result;
if (chunk >= chunkSize)
{
if (listener != null)
listener.onStreamNotification(this, chunk);
// Start a new chunk
chunk = 0;
}
}
}
| NotifyingBufferedOutputStream.java |