package tim.prune.load; import java.io.IOException; import java.io.InputStream; /** * Class to scoop bytes from an input stream into an array. * The size of the array doesn't have to be known in advance. * This is used for getting images and sound files out of zip * files or from remote URLs. */ public class ByteScooper { /** Bucket size in bytes */ private static final int BUCKET_SIZE = 5000; /** Amount by which barrel size is increased on demand */ private static final int BARREL_SIZE_INCREMENT = 100000; /** * Scoop bytes from the given input stream and return the result * @param inIs input stream to scoop bytes from * @return byte array */ public static byte[] scoop(InputStream inIs) throws IOException { byte[] _barrel = new byte[BARREL_SIZE_INCREMENT]; byte[] _bucket = new byte[BUCKET_SIZE]; int numBytesInBarrel = 0; // read from stream into the bucket int numBytesRead = inIs.read(_bucket); while (numBytesRead >= 0) { // expand barrel if necessary if ((numBytesInBarrel + numBytesRead) > _barrel.length) { byte[] newBarrel = new byte[_barrel.length + BARREL_SIZE_INCREMENT]; System.arraycopy(_barrel, 0, newBarrel, 0, numBytesInBarrel); _barrel = newBarrel; } // copy from bucket into barrel System.arraycopy(_bucket, 0, _barrel, numBytesInBarrel, numBytesRead); numBytesInBarrel += numBytesRead; // read next lot from stream into the bucket numBytesRead = inIs.read(_bucket); } // Now we know how many bytes there are, so crop to size if (numBytesInBarrel == 0) return null; byte[] result = new byte[numBytesInBarrel]; System.arraycopy(_barrel, 0, result, 0, numBytesInBarrel); return result; } }