@Override public void write(DataOutput out) throws IOException { Buffer buffer = page.buffer(); out.writeInt(buffer.limit()); out.write(buffer.array(), buffer.offset(), buffer.limit()); List<String> stringReferences = page.getStringReferences(); WritableUtils.writeVInt(out, stringReferences.size()); for (String s : stringReferences) { out.writeUTF(s); } }
@Override public void readFields(DataInput in) throws IOException { int bufferSize = in.readInt(); byte[] bytes = new byte[bufferSize]; // TODO usa buffer allocator? in.readFully(bytes, 0, bufferSize); Buffer buffer = Buffer.wrap(bytes); int stringCount = WritableUtils.readVInt(in); List<String> strings = new ArrayList<String>(stringCount); for (int i = 0; i < stringCount; i++) { strings.add(in.readUTF()); } Page newPage = Page.wrap(buffer); newPage.setStringReferences(strings); if (page != null) { page.release(); } page = newPage; }
public Buffer poll() { if (current == null) { throw new IllegalStateException("nextFile() must be called before poll()"); } Buffer buffer = allocator.allocate(); try { int n = current.read(buffer.array(), buffer.offset(), buffer.capacity()); if (n < 0) { return null; } buffer.limit(n); Buffer b = buffer; buffer = null; return b; } catch (IOException ex) { throw new RuntimeException(ex); } finally { if (buffer != null) { buffer.release(); buffer = null; } } }