diff --git a/core/src/main/java/com/yahoo/ycsb/ByteArrayByteIterator.java b/core/src/main/java/com/yahoo/ycsb/ByteArrayByteIterator.java
index 8f8762b4f2d9060af997e1e3fba5fd723b2d1175..cf1470cbc0bc606ec6649f0311b3e51ca799ba85 100644
--- a/core/src/main/java/com/yahoo/ycsb/ByteArrayByteIterator.java
+++ b/core/src/main/java/com/yahoo/ycsb/ByteArrayByteIterator.java
@@ -21,7 +21,7 @@ package com.yahoo.ycsb;
  */
 public class ByteArrayByteIterator extends ByteIterator {
   private final int originalOffset;
-  private byte[] str;
+  private final byte[] str;
   private int off;
   private final int len;
 
@@ -60,5 +60,14 @@ public class ByteArrayByteIterator extends ByteIterator {
   public void reset() {
     off = originalOffset;
   }
-  
+
+  @Override
+  public byte[] toArray() {
+    int size = (int) bytesLeft();
+    byte[] bytes = new byte[size];
+    System.arraycopy(str, off, bytes, 0, size);
+    off = len;
+    return bytes;
+  }
+
 }
diff --git a/core/src/main/java/com/yahoo/ycsb/ByteIterator.java b/core/src/main/java/com/yahoo/ycsb/ByteIterator.java
index 9be84d5a050b0ecd3b30e91bd8a1ec7ca5306017..616675ce057175074159c24d21265411c28e6dd5 100644
--- a/core/src/main/java/com/yahoo/ycsb/ByteIterator.java
+++ b/core/src/main/java/com/yahoo/ycsb/ByteIterator.java
@@ -96,9 +96,8 @@ public abstract class ByteIterator implements Iterator<Byte> {
       throw new ArrayIndexOutOfBoundsException("Too much data to fit in one array!");
     }
     byte[] ret = new byte[(int) left];
-    int off = 0;
-    while (off < ret.length) {
-      off = nextBuf(ret, off);
+    for (int i = 0; i < ret.length; i++) {
+      ret[i] = nextByte();
     }
     return ret;
   }
diff --git a/core/src/main/java/com/yahoo/ycsb/InputStreamByteIterator.java b/core/src/main/java/com/yahoo/ycsb/InputStreamByteIterator.java
index 02ca38006c9dd0644b220209d92b22d8113e8522..31c37065bad60f6881b084c8e0705add3d35b132 100644
--- a/core/src/main/java/com/yahoo/ycsb/InputStreamByteIterator.java
+++ b/core/src/main/java/com/yahoo/ycsb/InputStreamByteIterator.java
@@ -23,8 +23,8 @@ import java.io.InputStream;
  *  A ByteIterator that iterates through an inputstream of bytes.
  */
 public class InputStreamByteIterator extends ByteIterator {
-  private long len;
-  private InputStream ins;
+  private final long len;
+  private final InputStream ins;
   private long off;
   private final boolean resetable;
 
@@ -63,17 +63,34 @@ public class InputStreamByteIterator extends ByteIterator {
     return len - off;
   }
 
+  @Override
+  public byte[] toArray() {
+    int size = (int) bytesLeft();
+    byte[] bytes = new byte[size];
+    try {
+      if (ins.read(bytes) < size) {
+        throw new IllegalStateException("Past EOF!");
+      }
+    } catch (IOException e) {
+      throw new IllegalStateException(e);
+    }
+    off = len;
+    return bytes;
+  }
+  
   @Override
   public void reset() {
     if (resetable) {
       try {
         ins.reset();
         ins.mark((int) len);
+        off = 0;
       } catch (IOException e) {
         throw new IllegalStateException("Failed to reset the input stream", e);
       }
+    } else {
+      throw new UnsupportedOperationException();
     }
-    throw new UnsupportedOperationException();
   }
   
 }
diff --git a/core/src/main/java/com/yahoo/ycsb/RandomByteIterator.java b/core/src/main/java/com/yahoo/ycsb/RandomByteIterator.java
index e21689cce26770668314b4f72ab8b53d8365724f..336326616ce66ebbbe748c938b985200c2ef2bc5 100644
--- a/core/src/main/java/com/yahoo/ycsb/RandomByteIterator.java
+++ b/core/src/main/java/com/yahoo/ycsb/RandomByteIterator.java
@@ -22,10 +22,10 @@ import java.util.concurrent.ThreadLocalRandom;
  *  A ByteIterator that generates a random sequence of bytes.
  */
 public class RandomByteIterator extends ByteIterator {
-  private long len;
+  private final long len;
   private long off;
   private int bufOff;
-  private byte[] buf;
+  private final byte[] buf;
 
   @Override
   public boolean hasNext() {
@@ -100,5 +100,19 @@ public class RandomByteIterator extends ByteIterator {
   public void reset() {
     off = 0;
   }
-  
+
+  /** Consumes remaining contents of this object, and returns them as a byte array. */
+  public byte[] toArray() {
+    long left = bytesLeft();
+    if (left != (int) left) {
+      throw new ArrayIndexOutOfBoundsException("Too much data to fit in one array!");
+    }
+    byte[] ret = new byte[(int) left];
+    int bufOffset = 0;
+    while (bufOffset < ret.length) {
+      bufOffset = nextBuf(ret, bufOffset);
+    }
+    return ret;
+  }
+
 }
diff --git a/core/src/main/java/com/yahoo/ycsb/StringByteIterator.java b/core/src/main/java/com/yahoo/ycsb/StringByteIterator.java
index 82235491887163c8252295b1e1143f9c4baf0b4e..63dba8946977e262fa5949982d1551f5fdbf9466 100644
--- a/core/src/main/java/com/yahoo/ycsb/StringByteIterator.java
+++ b/core/src/main/java/com/yahoo/ycsb/StringByteIterator.java
@@ -100,7 +100,17 @@ public class StringByteIterator extends ByteIterator {
   public void reset() {
     off = 0;
   }
-  
+
+  @Override
+  public byte[] toArray() {
+    byte[] bytes = new byte[(int) bytesLeft()];
+    for (int i = 0; i < bytes.length; i++) {
+      bytes[i] = (byte) str.charAt(off + i);
+    }
+    off = str.length();
+    return bytes;
+  }
+
   /**
    * Specialization of general purpose toString() to avoid unnecessary
    * copies.