FastOutputStream.java [plain text]
package com.sleepycat.bdb.util;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
public class FastOutputStream extends OutputStream {
public static final int DEFAULT_INIT_SIZE = 100;
public static final int DEFAULT_BUMP_SIZE = 100;
private int len;
private int bumpLen;
private byte[] buf;
public FastOutputStream() {
buf = new byte[DEFAULT_INIT_SIZE];
bumpLen = DEFAULT_BUMP_SIZE;
}
public FastOutputStream(int initialSize) {
buf = new byte[initialSize];
bumpLen = DEFAULT_BUMP_SIZE;
}
public FastOutputStream(int initialSize, int bumpSize) {
buf = new byte[initialSize];
bumpLen = bumpSize;
}
public FastOutputStream(byte[] buffer) {
buf = buffer;
bumpLen = DEFAULT_BUMP_SIZE;
}
public FastOutputStream(byte[] buffer, int bumpSize) {
buf = buffer;
bumpLen = bumpSize;
}
public int size() {
return len;
}
public void reset() {
len = 0;
}
public void write(int b) throws IOException {
if (len + 1 > buf.length)
bump(1);
buf[len++] = (byte) b;
}
public void write(byte[] fromBuf) throws IOException {
int needed = len + fromBuf.length - buf.length;
if (needed > 0)
bump(needed);
for (int i = 0; i < fromBuf.length; i++)
buf[len++] = fromBuf[i];
}
public void write(byte[] fromBuf, int offset, int length)
throws IOException {
int needed = len + length - buf.length;
if (needed > 0)
bump(needed);
int fromLen = offset + length;
for (int i = offset; i < fromLen; i++)
buf[len++] = fromBuf[i];
}
public synchronized void writeTo(OutputStream out) throws IOException {
out.write(buf, 0, len);
}
public String toString() {
return new String(buf, 0, len);
}
public String toString(String encoding)
throws UnsupportedEncodingException {
return new String(buf, 0, len, encoding);
}
public byte[] toByteArray() {
byte[] toBuf = new byte[len];
for (int i = 0; i < len; i++)
toBuf[i] = buf[i];
return toBuf;
}
public void toByteArray(byte[] toBuf, int offset) {
int toLen = (toBuf.length > len) ? len : toBuf.length;
for (int i = offset; i < toLen; i++)
toBuf[i] = buf[i];
}
public byte[] getBufferBytes() {
return buf;
}
public int getBufferOffset() {
return 0;
}
public int getBufferLength() {
return len;
}
public void makeSpace(int sizeNeeded) {
int needed = len + sizeNeeded - buf.length;
if (needed > 0)
bump(needed);
}
public void addSize(int sizeAdded) {
len += sizeAdded;
}
private void bump(int needed) {
byte[] toBuf = new byte[buf.length + needed + bumpLen];
for (int i = 0; i < len; i++)
toBuf[i] = buf[i];
buf = toBuf;
}
}