package org.rzo.yajsw.io;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.Writer;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import org.rzo.yajsw.util.DaemonThreadFactory;
public class NonBlockingWriter extends Writer
{
OutputStream _out;
CircularBuffer _buffer;
boolean _closed = false;
byte[] _writeBuffer;
static final Executor executor = Executors.newCachedThreadPool(new DaemonThreadFactory("nonblockingwriter"));
public NonBlockingWriter(OutputStream out, int size, String fullIndicator)
{
_out = out;
_buffer = new CircularBuffer(size, true);
_buffer.setFullIndicator(fullIndicator);
_buffer.setWriteBlocking(false);
int writeSize = size / 10;
if (writeSize > 1024)
writeSize = 1024;
else if (writeSize < 100)
writeSize = size / 2;
if (writeSize == 0)
writeSize = 1;
_writeBuffer = new byte[writeSize];
executor.execute(new Runnable()
{
public void run()
{
while (!_closed)
{
int len = _buffer.get(_writeBuffer, 0, _writeBuffer.length);
try
{
_out.write(_writeBuffer, 0, len);
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
});
}
@Override
public void close() throws IOException
{
_closed = true;
_out.close();
}
@Override
public void flush() throws IOException
{
}
@Override
public void write(char[] cbuf, int off, int len) throws IOException
{
_buffer.write(cbuf, off, len);
}
public static void main(String[] args) throws IOException
{
OutputStream s = new FileOutputStream("c:/test.txt");
NonBlockingWriter w = new NonBlockingWriter(s, 1024, "!!! BUFFER FULL !!!");
int i = 0;
while (i < 10000)
{
w.write("12345678" + "\n\r");
try
{
Thread.yield();
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
i++;
}
}
}