package org.postgresql.largeobject; import java.io.IOException; import java.io.OutputStream; import java.sql.SQLException; /* * This implements a basic output stream that writes to a LargeObject */ public class BlobOutputStream extends OutputStream { /* * The parent LargeObject */ private LargeObject lo; /* * Buffer */ private byte buf[]; /* * Size of the buffer (default 1K) */ private int bsize; /* * Position within the buffer */ private int bpos; /* * Create an OutputStream to a large object * @param lo LargeObject */ public BlobOutputStream(LargeObject lo) { this(lo, 1024); } /* * Create an OutputStream to a large object * @param lo LargeObject * @param bsize The size of the buffer used to improve performance */ public BlobOutputStream(LargeObject lo, int bsize) { this.lo = lo; this.bsize = bsize; buf = new byte[bsize]; bpos = 0; } public void write(int b) throws java.io.IOException { try { if (bpos >= bsize) { lo.write(buf); bpos = 0; } buf[bpos++] = (byte)b; } catch (SQLException se) { throw new IOException(se.toString()); } } /* * Flushes this output stream and forces any buffered output bytes * to be written out. The general contract of flush is * that calling it is an indication that, if any bytes previously * written have been buffered by the implementation of the output * stream, such bytes should immediately be written to their * intended destination. * * @exception IOException if an I/O error occurs. */ public void flush() throws IOException { try { if (bpos > 0) lo.write(buf, 0, bpos); bpos = 0; } catch (SQLException se) { throw new IOException(se.toString()); } } /* * Closes this output stream and releases any system resources * associated with this stream. The general contract of close * is that it closes the output stream. A closed stream cannot perform * output operations and cannot be reopened. *

* The close method of OutputStream does nothing. * * @exception IOException if an I/O error occurs. */ public void close() throws IOException { try { flush(); lo.close(); lo = null; } catch (SQLException se) { throw new IOException(se.toString()); } } }