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 and Description
    --- | ---
    `static class` | `BATBlock.BATBlockAndIndex`

  - ### Method Summary

    All Methods Static Methods Instance Methods Concrete Methods
    Modifier and Type | Method and Description
    --- | ---
    `static long` | `calculateMaximumSize(HeaderBlock header)`
    `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 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 live
    `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.
    `int` | `getUsedSectors(boolean isAnXBAT)` How many sectors in this block are taken? Note that calling `hasFreeSectors()` is much quicker
    `int` | `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 live
    `void` | `setValueAt(int relativeOffset, int value)`
    `void` | `writeBlocks(java.io.OutputStream stream)` Write the block's data to an OutputStream
    `void` | `writeData(java.nio.ByteBuffer block)`

    - ### Methods inherited from class java.lang.Object

      `clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

- - ### 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 calling `hasFreeSectors()` 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 interface `BlockWritable`
      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)

Copyright 2020 The Apache Software Foundation or its licensors, as applicable.