Using Zero-Copy API to read

Replace all the byte array based API with Byte Buffer based API in the reading path to avoid byte array copy.
1.Introduce a Compatible layer to keep compatible with old Hadoop API
2.Make the whole read path use ByteBuffer directly

Avoid using mark and reset, they have side effects and could cause potential multi-threading problem.
You could call duplicate to create a subview of the ByteBuffer, position it to the offset and read from there