/*- * See the file LICENSE for redistribution information. * * Copyright (c) 2000-2004 * Sleepycat Software. All rights reserved. * * $Id: FastOutputStream.java,v 1.3 2004/07/03 16:15:36 mark Exp $ */ package com.sleepycat.util; import java.io.IOException; import java.io.OutputStream; import java.io.UnsupportedEncodingException; /** * A replacement for ByteArrayOutputStream that does not synchronize every * byte read. * *
This class extends {@link OutputStream} and its write()
* methods allow it to be used as a standard output stream. In addition, it
* provides writeFast() methods that are not declared to throw
* IOException. IOException is never thrown by this
* class.
write(int) but does not throw
* IOException.
* @see #write(int)
*/
public final void writeFast(int b) {
if (len + 1 > buf.length)
bump(1);
buf[len++] = (byte) b;
}
/**
* Equivalent to write(byte[]) but does not throw
* IOException.
* @see #write(byte[])
*/
public final void writeFast(byte[] fromBuf) {
int needed = len + fromBuf.length - buf.length;
if (needed > 0)
bump(needed);
for (int i = 0; i < fromBuf.length; i++)
buf[len++] = fromBuf[i];
}
/**
* Equivalent to write(byte[],int,int) but does not throw
* IOException.
* @see #write(byte[],int,int)
*/
public final void writeFast(byte[] fromBuf, int offset, int length) {
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];
}
/**
* Copy the buffered data to the given array.
*
* @param toBuf the buffer to hold a copy of the data.
*
* @param offset the offset at which to start copying.
*/
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];
}
/**
* Returns the buffer owned by this object.
*
* @return the buffer.
*/
public byte[] getBufferBytes() {
return buf;
}
/**
* Returns the offset of the internal buffer.
*
* @return always zero currently.
*/
public int getBufferOffset() {
return 0;
}
/**
* Returns the length used in the internal buffer, i.e., the offset at
* which data will be written next.
*
* @return the buffer length.
*/
public int getBufferLength() {
return len;
}
/**
* Ensure that at least the given number of bytes are available in the
* internal buffer.
*
* @param sizeNeeded the number of bytes desired.
*/
public void makeSpace(int sizeNeeded) {
int needed = len + sizeNeeded - buf.length;
if (needed > 0)
bump(needed);
}
/**
* Skip the given number of bytes in the buffer.
*
* @param sizeAdded number of bytes to skip.
*/
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;
}
}