org.apache.pig.impl.io.BufferedPositionedInputStream is not actually buffered. This is because it sits atop a FSDataInputStream (somewhere down the stack), which is buffered. So to avoid double buffering, which can be bad, BufferedPositionedInputStream was written without buffering. But the FSDataInputStream is far enough down the stack that it is still quite costly to call read() individually for each byte. A run through a profiler shows that a fair amount of time is being spent in BufferedPositionedInputStream.read().