--- /dev/null
+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;
+ }
+}