FileDocCategorySizeDatePackage
DocumentBlock.javaAPI DocApache Poi 3.0.16853Mon Jan 01 12:39:36 GMT 2007org.apache.poi.poifs.storage

DocumentBlock

public class DocumentBlock extends BigBlock
A block of document data.
author
Marc Johnson (mjohnson at apache dot org)

Fields Summary
private static final byte
_default_value
private byte[]
_data
private int
_bytes_read
Constructors Summary
public DocumentBlock(RawDataBlock block)
create a document block from a raw data block

param
block the raw data block
exception
IOException


                          

       
         
    
        _data       = block.getData();
        _bytes_read = _data.length;
    
public DocumentBlock(InputStream stream)
Create a single instance initialized with data.

param
stream the InputStream delivering the data.
exception
IOException

        this();
        int count = IOUtils.readFully(stream, _data);

        _bytes_read = (count == -1) ? 0
                                    : count;
    
private DocumentBlock()
Create a single instance initialized with default values

        _data = new byte[ POIFSConstants.BIG_BLOCK_SIZE ];
        Arrays.fill(_data, _default_value);
    
Methods Summary
public static org.apache.poi.poifs.storage.DocumentBlock[]convert(byte[] array, int size)
convert a single long array into an array of DocumentBlock instances

param
array the byte array to be converted
param
size the intended size of the array (which may be smaller)
return
an array of DocumentBlock instances, filled from the input array

        DocumentBlock[] rval   =
            new DocumentBlock[ (size + POIFSConstants.BIG_BLOCK_SIZE - 1) / POIFSConstants.BIG_BLOCK_SIZE ];
        int             offset = 0;

        for (int k = 0; k < rval.length; k++)
        {
            rval[ k ] = new DocumentBlock();
            if (offset < array.length)
            {
                int length = Math.min(POIFSConstants.BIG_BLOCK_SIZE,
                                      array.length - offset);

                System.arraycopy(array, offset, rval[ k ]._data, 0, length);
                if (length != POIFSConstants.BIG_BLOCK_SIZE)
                {
                    Arrays.fill(rval[ k ]._data, length,
                                POIFSConstants.BIG_BLOCK_SIZE,
                                _default_value);
                }
            }
            else
            {
                Arrays.fill(rval[ k ]._data, _default_value);
            }
            offset += POIFSConstants.BIG_BLOCK_SIZE;
        }
        return rval;
    
public static bytegetFillByte()

return
the fill byte used

        return _default_value;
    
public booleanpartiallyRead()
Was this a partially read block?

return
true if the block was only partially filled with data

        return _bytes_read != POIFSConstants.BIG_BLOCK_SIZE;
    
public static voidread(org.apache.poi.poifs.storage.DocumentBlock[] blocks, byte[] buffer, int offset)
read data from an array of DocumentBlocks

param
blocks the blocks to read from
param
buffer the buffer to write the data into
param
offset the offset into the array of blocks to read from

        int firstBlockIndex  = offset / POIFSConstants.BIG_BLOCK_SIZE;
        int firstBlockOffset = offset % POIFSConstants.BIG_BLOCK_SIZE;
        int lastBlockIndex   = (offset + buffer.length - 1)
                               / POIFSConstants.BIG_BLOCK_SIZE;

        if (firstBlockIndex == lastBlockIndex)
        {
            System.arraycopy(blocks[ firstBlockIndex ]._data,
                             firstBlockOffset, buffer, 0, buffer.length);
        }
        else
        {
            int buffer_offset = 0;

            System.arraycopy(blocks[ firstBlockIndex ]._data,
                             firstBlockOffset, buffer, buffer_offset,
                             POIFSConstants.BIG_BLOCK_SIZE
                             - firstBlockOffset);
            buffer_offset += POIFSConstants.BIG_BLOCK_SIZE - firstBlockOffset;
            for (int j = firstBlockIndex + 1; j < lastBlockIndex; j++)
            {
                System.arraycopy(blocks[ j ]._data, 0, buffer, buffer_offset,
                                 POIFSConstants.BIG_BLOCK_SIZE);
                buffer_offset += POIFSConstants.BIG_BLOCK_SIZE;
            }
            System.arraycopy(blocks[ lastBlockIndex ]._data, 0, buffer,
                             buffer_offset, buffer.length - buffer_offset);
        }
    
public intsize()
Get the number of bytes read for this block

return
bytes read into the block

        return _bytes_read;
    
voidwriteData(java.io.OutputStream stream)
Write the block's data to an OutputStream

param
stream the OutputStream to which the stored data should be written
exception
IOException on problems writing to the specified stream

        doWriteData(stream, _data);