@Override public synchronized boolean next(NullWritable key, BytesWritable value) throws IOException {

    /* read the record length */
    int lengthExpected = recordLengthBytes.length;
    int hasConsumed = readExpectedBytes(recordLengthBytes, lengthExpected);
    if (hasConsumed == 0) {
      LOG.info("Reach the End of File. No more record");
      return false;
    } else if (hasConsumed < lengthExpected) {
      LOG.error(
          format("We expect %s bytes for the record length but read %d byte and reach the End of File.", lengthExpected,
              hasConsumed));
      LOG.error(format("The current position in the file : %s", getFilePosition()));
      LOG.error(format("The current consumed bytes: %s", pos));
      LOG.error(format("The bytes for the current record is: %s", Hex.encodeHexString(recordLengthBytes)));
      throw new EOFException("When reading the record length, reach the unexpected end of file.");
    }
    /* get the record contend length to prepare to read the content */
    recordLength = EndianUtils.readSwappedUnsignedShort(recordLengthBytes, 0);
    pos += lengthExpected;

    /* read the record content */
    lengthExpected = recordLength;
    hasConsumed = readExpectedBytes(valueByteArray, lengthExpected);
    if (hasConsumed < lengthExpected) {
      LOG.error(format("We expect %s bytes for the record content but read %d byte and reach the End of File.",
          lengthExpected, hasConsumed));
      LOG.error(format("The current position in the file : %s", getFilePosition()));
      LOG.error(format("The current consumed bytes: %s", pos));
      LOG.error(format("The bytes for the current record is: %s",
          Hex.encodeHexString(recordLengthBytes) + Hex.encodeHexString(valueByteArray)));
      throw new EOFException("When reading the contend of the record, reach the unexpected end of file.");
    }
    value.set(valueByteArray, 0, recordLength);
    pos += lengthExpected;

    /* read the record end */
    lengthExpected = endOfRecord.length;
    hasConsumed = readExpectedBytes(endOfRecord, lengthExpected);
    if (hasConsumed < lengthExpected) {
      LOG.error(format("We expect %s bytes for the record end symbol but read %d byte and reach the End of File.",
          lengthExpected, hasConsumed));
      LOG.error(format("The current position in the file : %s", getFilePosition()));
      LOG.error(format("The current consumed bytes: %s", pos));
      LOG.error(format("The bytes for the current record is: %s",
          Hex.encodeHexString(recordLengthBytes) + Hex.encodeHexString(valueByteArray) + Hex
              .encodeHexString(endOfRecord)));
      throw new EOFException("When reading the end of record, reach the unexpected end of file.");
    }

    if (endOfRecord[0] != TeradataBinaryFileOutputFormat.RECORD_END_BYTE) {
      throw new IOException(format("We expect 0x0a as the record end but get %s.", Hex.encodeHexString(endOfRecord)));
    }
    pos += lengthExpected;

    return true;
  }
Reads the next key/value pair from the input for processing.

@param key the key to read data into
@param value the value to read data into
@return true iff a key/value was read, false if at EOF
ql/src/java/org/apache/hadoop/hive/ql/io/TeradataBinaryRecordReader.java