package edu.berkeley.cs.succinct.block;
import edu.berkeley.cs.succinct.SerializationException;
import edu.berkeley.cs.succinct.util.container.IntArrayList;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Iterator;
/**
* Serializes a block of byte arrays into a single byte array, separating two adjacent byte arrays
* by a delimiter. The delimiter is provided as an input, and must not be a part of the input.
*/
public class ByteArrayBlockSerializer implements BlockSerializer<byte[]> {
private byte recordSeparator;
/**
* Constructor to initialize the ByteArrayBlockSerializer.
*
* @param recordSeparator The record separator byte to separate records.
*/
public ByteArrayBlockSerializer(byte recordSeparator) {
this.recordSeparator = recordSeparator;
}
@Override public SerializedData serialize(Iterator<byte[]> data) throws SerializationException {
ByteArrayOutputStream out = new ByteArrayOutputStream();
IntArrayList offsets = new IntArrayList();
out.write(recordSeparator);
int currentOffset = 1;
while (data.hasNext()) {
byte[] recordData = data.next();
try {
offsets.add(currentOffset);
out.write(recordData);
out.write(recordSeparator);
currentOffset += recordData.length + 1;
} catch (IOException e) {
throw new SerializationException(e.getCause());
}
}
return new SerializedData(out.toByteArray(), offsets.toArray(), null);
}
/**
* Get the record separator byte.
*
* @return The record separator byte.
*/
public byte getRecordSeparator() {
return recordSeparator;
}
/**
* Set the record separator byte.
*
* @param recordSeparator The record separator byte.
*/
public void setRecordSeparator(byte recordSeparator) {
this.recordSeparator = recordSeparator;
}
}