Package org.apache.poi.poifs.storage
Class BATBlock
- java.lang.Object
-
- org.apache.poi.poifs.storage.BATBlock
-
- All Implemented Interfaces:
BlockWritable
public final class BATBlock extends java.lang.Object implements BlockWritable
A block of block allocation table entries. BATBlocks are created only through a static factory method: createBATBlocks.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static class
BATBlock.BATBlockAndIndex
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description static long
calculateMaximumSize(POIFSBigBlockSize bigBlockSize, int numBATs)
Calculates the maximum size of a file which is addressable given the number of FAT (BAT) sectors specified.static long
calculateMaximumSize(HeaderBlock header)
static BATBlock
createBATBlock(POIFSBigBlockSize bigBlockSize, java.nio.ByteBuffer data)
Create a single BATBlock from the byte buffer, which must hold at least one big block of data to be read.static BATBlock
createEmptyBATBlock(POIFSBigBlockSize bigBlockSize, boolean isXBAT)
Creates a single BATBlock, with all the values set to empty.static BATBlock.BATBlockAndIndex
getBATBlockAndIndex(int offset, HeaderBlock header, java.util.List<BATBlock> bats)
Returns the BATBlock that handles the specified offset, and the relative index within it.int
getOurBlockIndex()
Retrieve where in the file we livestatic BATBlock.BATBlockAndIndex
getSBATBlockAndIndex(int offset, HeaderBlock header, java.util.List<BATBlock> sbats)
Returns the BATBlock that handles the specified offset, and the relative index within it, for the mini stream.int
getUsedSectors(boolean isAnXBAT)
How many sectors in this block are taken? Note that callinghasFreeSectors()
is much quickerint
getValueAt(int relativeOffset)
boolean
hasFreeSectors()
Does this BATBlock have any free sectors in it, or is it full?void
setOurBlockIndex(int index)
Record where in the file we livevoid
setValueAt(int relativeOffset, int value)
void
writeBlocks(java.io.OutputStream stream)
Write the block's data to an OutputStreamvoid
writeData(java.nio.ByteBuffer block)
-
-
-
Method Detail
-
createBATBlock
public static BATBlock createBATBlock(POIFSBigBlockSize bigBlockSize, java.nio.ByteBuffer data)
Create a single BATBlock from the byte buffer, which must hold at least one big block of data to be read.
-
createEmptyBATBlock
public static BATBlock createEmptyBATBlock(POIFSBigBlockSize bigBlockSize, boolean isXBAT)
Creates a single BATBlock, with all the values set to empty.
-
calculateMaximumSize
public static long calculateMaximumSize(POIFSBigBlockSize bigBlockSize, int numBATs)
Calculates the maximum size of a file which is addressable given the number of FAT (BAT) sectors specified. (We don't care if those BAT blocks come from the 109 in the header, or from header + XBATS, it won't affect the calculation) The actual file size will be between [size of fatCount-1 blocks] and [size of fatCount blocks]. For 512 byte block sizes, this means we may over-estimate by up to 65kb. For 4096 byte block sizes, this means we may over-estimate by up to 4mb
-
calculateMaximumSize
public static long calculateMaximumSize(HeaderBlock header)
-
getBATBlockAndIndex
public static BATBlock.BATBlockAndIndex getBATBlockAndIndex(int offset, HeaderBlock header, java.util.List<BATBlock> bats)
Returns the BATBlock that handles the specified offset, and the relative index within it. The List of BATBlocks must be in sequential order
-
getSBATBlockAndIndex
public static BATBlock.BATBlockAndIndex getSBATBlockAndIndex(int offset, HeaderBlock header, java.util.List<BATBlock> sbats)
Returns the BATBlock that handles the specified offset, and the relative index within it, for the mini stream. The List of BATBlocks must be in sequential order
-
hasFreeSectors
public boolean hasFreeSectors()
Does this BATBlock have any free sectors in it, or is it full?
-
getUsedSectors
public int getUsedSectors(boolean isAnXBAT)
How many sectors in this block are taken? Note that callinghasFreeSectors()
is much quicker
-
getValueAt
public int getValueAt(int relativeOffset)
-
setValueAt
public void setValueAt(int relativeOffset, int value)
-
setOurBlockIndex
public void setOurBlockIndex(int index)
Record where in the file we live
-
getOurBlockIndex
public int getOurBlockIndex()
Retrieve where in the file we live
-
writeBlocks
public void writeBlocks(java.io.OutputStream stream) throws java.io.IOException
Write the block's data to an OutputStream- Specified by:
writeBlocks
in interfaceBlockWritable
- Parameters:
stream
- the OutputStream to which the stored data should be written- Throws:
java.io.IOException
- on problems writing to the specified stream
-
writeData
public void writeData(java.nio.ByteBuffer block)
-
-