package org.appwork.utils;
import java.io.ByteArrayOutputStream;
import java.lang.ref.SoftReference;
import java.util.Iterator;
import java.util.LinkedList;
public class ReusableByteArrayOutputStreamPool {
public static class ReusableByteArrayOutputStream extends ByteArrayOutputStream {
protected ReusableByteArrayOutputStream(final int size) {
super(size);
}
public int bufferSize() {
return this.buf.length;
}
public byte[] getInternalBuffer() {
return this.buf;
}
}
private static final LinkedList<SoftReference<ReusableByteArrayOutputStream>> pool = new LinkedList<SoftReference<ReusableByteArrayOutputStream>>();
public static ReusableByteArrayOutputStream getReusableByteArrayOutputStream() {
return ReusableByteArrayOutputStreamPool.getReusableByteArrayOutputStream(32);
}
public static ReusableByteArrayOutputStream getReusableByteArrayOutputStream(final int wishedMinimumSize) {
final int wished = Math.max(32, wishedMinimumSize);
synchronized (ReusableByteArrayOutputStreamPool.pool) {
ReusableByteArrayOutputStream ret = null;
if (!ReusableByteArrayOutputStreamPool.pool.isEmpty()) {
final Iterator<SoftReference<ReusableByteArrayOutputStream>> it = ReusableByteArrayOutputStreamPool.pool.iterator();
while (it.hasNext()) {
final SoftReference<ReusableByteArrayOutputStream> next = it.next();
ret = next.get();
if (ret != null) {
if (ret.bufferSize() >= wishedMinimumSize) {
it.remove();
return ret;
}
break;
}
}
}
if (ret == null) {
ret = new ReusableByteArrayOutputStream(wished);
}
return ret;
}
}
public static void reuseReusableByteArrayOutputStream(final ReusableByteArrayOutputStream buf) {
if (buf == null) { return; }
synchronized (ReusableByteArrayOutputStreamPool.pool) {
ReusableByteArrayOutputStreamPool.pool.add(new SoftReference<ReusableByteArrayOutputStream>(buf));
buf.reset();
}
}
}