public void readDictionaryFile(DataInputStream in) throws IOException {
    int l;

    // read in the version number (right now we just ignore it)
    in.readInt();

    // read in the column map (this is serialized in its internal form:
    // an index array followed by a data array)
    l = in.readInt();
    char[] temp = new char[l];
    for (int i = 0; i < temp.length; i++)
      temp[i] = (char)in.readShort();
    l = in.readInt();
    byte[] temp2 = new byte[l];
    for (int i = 0; i < temp2.length; i++)
      temp2[i] = in.readByte();
    columnMap = new CompactByteArray(temp, temp2);

    // read in numCols and numColGroups
    numCols = in.readInt();
        /*numColGroups = */in.readInt();

    // read in the row-number index
    l = in.readInt();
    rowIndex = new short[l];
    for (int i = 0; i < rowIndex.length; i++)
      rowIndex[i] = in.readShort();

    // load in the populated-cells bitmap: index first, then bitmap list
    l = in.readInt();
    rowIndexFlagsIndex = new short[l];
    for (int i = 0; i < rowIndexFlagsIndex.length; i++)
      rowIndexFlagsIndex[i] = in.readShort();
    l = in.readInt();
    rowIndexFlags = new int[l];
    for (int i = 0; i < rowIndexFlags.length; i++)
      rowIndexFlags[i] = in.readInt();

    // load in the row-shift index
    l = in.readInt();
    rowIndexShifts = new byte[l];
    for (int i = 0; i < rowIndexShifts.length; i++)
      rowIndexShifts[i] = in.readByte();

    // finally, load in the actual state table
    l = in.readInt();
    table = new short[l];
    for (int i = 0; i < table.length; i++)
      table[i] = in.readShort();

    // this data structure is only necessary for testing and debugging purposes
    reverseColumnMap = new char[numCols];
    for (char c = 0; c < 0xffff; c++) {
      int col = columnMap.elementAt(c);
      if (col != 0) {
        reverseColumnMap[col] = c;
      }
    }

    // close the stream
    in.close();
  }