content: 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;
  	}
  }
  