final long start = split.getStart();
final long end = start + split.getLength();
// open the file and seek to the start of the split
final NFSDataInputStream in =
new NFSDataInputStream(split.getFileSystem().open(split.getFile()));
in.seek(start);
if (start != 0) {
while (in.getPos() < end) { // scan to the next newline in the file
char c = (char)in.read(); // bug: this assumes eight-bit characters.
if (c == '\r' || c == '\n') {
break;
}
}
}
return new RecordReader() {
/** Keys are longs. */
public Writable createKey() { return new LongWritable(); }
/** Values are lines. */
public Writable createValue() { return new UTF8(); }
/** Read a line. */
public boolean next(Writable key, Writable value) throws IOException {
long pos = in.getPos();
if (pos >= end)
return false;
((LongWritable)key).set(pos); // key is position
((UTF8)value).set(readLine(in)); // value is line