mDBFStream.skip(4);
mDBFStream.skipBytes(4);
	private void readDBFHeader(String []geometryFieldNames) throws IOException	{		int nDBFRecords, headerLength, nFields;		int i, j;		int fieldType;		byte dbfField[];		Vector dbfFields = new Vector();		int nBytesRead;		mDBFStream.skip(4);		nDBFRecords = readLittleEndianInt(mDBFStream);		headerLength = readLittleEndianShort(mDBFStream);		mDBFRecordLength = readLittleEndianShort(mDBFStream);		mDBFStream.skip(20);		nBytesRead = 32;		/*		 * Read record describing each field.		 */		do		{			dbfField = new byte[32];			dbfField[0] = (byte)(mDBFStream.read());			nBytesRead++;			if (dbfField[0] != DBF_HEADER_SENTINEL)			{				mDBFStream.read(dbfField, 1, dbfField.length - 1);				nBytesRead += dbfField.length - 1;				dbfFields.add(dbfField);			}		}		while (dbfField[0] != DBF_HEADER_SENTINEL);		nFields = dbfFields.size();		/*		 * Add one extra field to end of field list for the geometry.		 */		mFieldNames = new String[nFields + 1];		mFieldTypes = new int[nFields + 1];		mShapeFieldTypes = new int[nFields];		mShapeFieldLengths = new int[nFields];		mGeometryField = new int[1];		mGeometryField[0] = nFields;		if (geometryFieldNames.length > 0)			mFieldNames[nFields] = geometryFieldNames[0];		else			mFieldNames[nFields] = "GEOMETRY";					mFieldTypes[nFields] = Argument.GEOMETRY;		/*		 * Read description of each field.		 */		for (i = 0; i < nFields; i++)		{			dbfField = (byte [])(dbfFields.elementAt(i));			/*			 * Extract null terminated field name.			 */						mFieldNames[i] = unpackString(dbfField, 0, 11);			mShapeFieldTypes[i] = dbfField[11];			mShapeFieldLengths[i] = dbfField[16];			/*			 * Convert shape field type to our representation of field types.			 */			switch (mShapeFieldTypes[i])			{				case DBF_CHARACTER:				case DBF_DATE:					mFieldTypes[i] = Argument.STRING;					break;				case DBF_LOGICAL:				case DBF_NUMBER:				case DBF_FLOATING:					mFieldTypes[i] = Argument.NUMERIC;					break;			}		}		/*		 * Leave DBF file at position of first record.		 */		int skipBytes = headerLength - nBytesRead;		if (skipBytes > 0)			mDBFStream.skip(skipBytes);	}