// ConcurrentBufferOutputStream.java -- write bytes to blocking queue // Copyright (c)2007 Christopher League <league@contrapunctus.net> // This is free software, but it comes with ABSOLUTELY NO WARRANTY. // GNU Lesser General Public License 2.1 or Common Public License 1.0 package net.contrapunctus.lzma; import java.io.BufferedOutputStream; import java.io.IOException; import java.io.InterruptedIOException; import java.io.OutputStream; import java.io.PrintStream; import java.util.concurrent.ArrayBlockingQueue; class ConcurrentBufferOutputStream extends OutputStream { protected ArrayBlockingQueue<byte[]> q; static final int BUFSIZE = 16384; static final int QUEUESIZE = 4096; private static final PrintStream dbg = System.err; private static final boolean DEBUG; static { String ds = null; try { ds = System.getProperty("DEBUG_ConcurrentBuffer"); } catch(SecurityException e) { } DEBUG = ds != null; } private ConcurrentBufferOutputStream( ArrayBlockingQueue<byte[]> q ) { if(DEBUG) dbg.printf("%s >> %s%n", this, q); this.q = q; } static OutputStream create( ArrayBlockingQueue<byte[]> q ) { OutputStream out = new ConcurrentBufferOutputStream( q ); out = new BufferedOutputStream( out, BUFSIZE ); return out; } static ArrayBlockingQueue<byte[]> newQueue( ) { return new ArrayBlockingQueue<byte[]>( QUEUESIZE ); } protected void guarded_put( byte[] a ) throws IOException { try { q.put( a ); } catch( InterruptedException exn ) { throw new InterruptedIOException( exn.getMessage() ); } } public void write( int i ) throws IOException { byte b[] = new byte[1]; b[0] = (byte) (i & 0xff); guarded_put( b ); } public void write(byte[] b, int off, int len) throws IOException { byte[] a = new byte [len]; System.arraycopy(b, off, a, 0, len); guarded_put( a ); } public void close( ) throws IOException { if(DEBUG) dbg.printf("%s closed%n", this); byte b[] = new byte[0]; // sentinel guarded_put( b ); } }