private void writeIFDs(List<TiffIFDEntry> ifds) throws IOException {
    long offset = this.theChannel.position();

    // This is supposed to start on a word boundary, via decree of the spec.
    long adjust = offset % 4L;
    offset += (adjust == 0) ? 0 : (4L - adjust);

    this.theChannel.position(offset);

    Collections.sort(ifds);

    ByteBuffer dataBuff = ByteBuffer.allocateDirect(ifds.size() * 12);

    // The IFD directory is preceeded by a SHORT count of the number of entries...
    putUnsignedShort(dataBuff, ifds.size());
    dataBuff.flip();
    this.theChannel.write(dataBuff);

    dataBuff.clear();
    for (TiffIFDEntry ifd : ifds) {
      putUnsignedShort(dataBuff, ifd.tag);
      putUnsignedShort(dataBuff, ifd.type);
      putUnsignedInt(dataBuff, ifd.count);
      if (ifd.type == Tiff.Type.SHORT && ifd.count == 1) {
        // these get packed in the first few bytes...
        putUnsignedShort(dataBuff, (int) ifd.valOffset);
        dataBuff.putShort((short) 0);
      } else putUnsignedInt(dataBuff, ifd.valOffset);
    }
    dataBuff.flip();
    this.theChannel.write(dataBuff);

    // The spec requires 4 bytes of zeros at the end...
    dataBuff.clear();
    dataBuff.putInt(0);
    dataBuff.flip();
    this.theChannel.write(dataBuff);

    // go back and patch up the ifd offset in header...
    this.theChannel.position(4);
    dataBuff.clear();
    putUnsignedInt(dataBuff, offset);
    dataBuff.flip();
    this.theChannel.write(dataBuff);
  }