{
//if the length is zero then don't bother trying to decode
//some filters don't work when attempting to decode
//with a zero length stream. See zlib_error_01.pdf
IOUtils.closeQuietly(unFilteredStream);
unFilteredStream = new RandomAccessFileOutputStream( buffer );
done = true;
}
else
{
//ok this is a simple hack, sometimes we read a couple extra
//bytes that shouldn't be there, so we encounter an error we will just
//try again with one less byte.
for (int tryCount = 0; length > 0 && !done && tryCount < 5; tryCount++)
{
InputStream input = null;
try
{
input = new BufferedInputStream(
new RandomAccessFileInputStream( buffer, position, length ), BUFFER_SIZE );
IOUtils.closeQuietly(unFilteredStream);
unFilteredStream = new RandomAccessFileOutputStream( buffer );
decodeResult = filter.decode( input, unFilteredStream, this, filterIndex );
done = true;
}
catch( IOException io )
{
length--;
exception = io;
}
finally
{
IOUtils.closeQuietly(input);
}
}
if( !done )
{
//if no good stream was found then lets try again but with the
//length of data that was actually read and not length
//defined in the dictionary
length = writtenLength;
for( int tryCount=0; !done && tryCount<5; tryCount++ )
{
InputStream input = null;
try
{
input = new BufferedInputStream(
new RandomAccessFileInputStream( buffer, position, length ), BUFFER_SIZE );
IOUtils.closeQuietly(unFilteredStream);
unFilteredStream = new RandomAccessFileOutputStream( buffer );
decodeResult = filter.decode( input, unFilteredStream, this, filterIndex);
done = true;
}
catch( IOException io )
{