package org.basex.io.out;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import org.basex.io.IO;
/**
* This class uses a byte buffer to speed up output stream processing.
*
* @author BaseX Team 2005-12, BSD License
* @author Christian Gruen
* @author Tim Petrowsky
*/
public final class BufferOutput extends OutputStream {
/** Buffer size. */
private final int bufsize;
/** Byte buffer. */
private final byte[] buffer;
/** Reference to the data output stream. */
private final OutputStream os;
/** Current buffer position. */
private int pos;
/**
* Constructor.
* @param file target file
* @throws IOException I/O exception
*/
public BufferOutput(final String file) throws IOException {
this(new FileOutputStream(file), IO.BLOCKSIZE);
}
/**
* Constructor with a default buffer size.
* @param out the stream to write to
*/
public BufferOutput(final OutputStream out) {
this(out, IO.BLOCKSIZE);
}
/**
* Constructor with a specific buffer size.
* @param out the stream to write to
* @param bufs buffer size
*/
public BufferOutput(final OutputStream out, final int bufs) {
os = out;
buffer = new byte[bufs];
bufsize = bufs;
}
@Override
public void write(final int b) throws IOException {
if(pos == bufsize) flush();
buffer[pos++] = (byte) b;
}
@Override
public void flush() throws IOException {
os.write(buffer, 0, pos);
pos = 0;
}
@Override
public void close() throws IOException {
flush();
os.close();
}
}