001
002
003 import java.io.IOException;
004 import java.io.ByteArrayOutputStream;
005 import java.io.ByteArrayInputStream;
006 import java.io.ObjectOutputStream;
007 import java.io.ObjectInputStream;
008
009 import java.nio.ByteBuffer;
010
011
012 /**
013 * A wraper class to java.nio.ByteBuffer for handling objects.
014 * The internal ByteBuffer is used for storing and retrieving objects.
015 * The ByteBuffer may be direct or a heap buffer.
016 * There are no bulk get / put methods since an object array can also
017 * be get / put as single object.
018 * @author Heinz Kredel.
019 */
020
021 public class ObjectBuffer {
022
023 /*
024 * The data structure.
025 */
026 private ByteBuffer bb;
027
028
029 /**
030 * Wrap an existing ByteBuffer as Object Buffer.
031 */
032 public ObjectBuffer(ByteBuffer bb) {
033 this.bb = bb;
034 }
035
036
037 /**
038 * Get and remove the next Object form the ByteBuffer.
039 * If only a partial object remains in the buffer an
040 * BufferUnderFlowException is thrown.
041 * @return the next object from the buffer.
042 */
043 public Object get() throws IOException, ClassNotFoundException {
044 int pos;
045 int rem;
046 byte[] cont;
047 if ( bb.hasArray() ) {
048 cont = bb.array();
049 pos = bb.position();
050 rem = bb.remaining();
051 } else { // could be inefficient
052 bb.mark();
053 ByteBuffer bba = ByteBuffer.allocate( bb.remaining() );
054 bba.clear();
055 bba.put( bb );
056 bba.rewind();
057 cont = bba.array();
058 pos = bba.position();
059 rem = bba.remaining();
060 bb.reset();
061 }
062 ByteArrayInputStream is
063 = new ByteArrayInputStream( cont, pos, rem );
064 int read = is.available();
065 ObjectInputStream ois = new ObjectInputStream( is );
066 Object obj = ois.readObject();
067 ois.close();
068 read = read - is.available();
069 //System.out.println("read = " + read);
070 bb.position( bb.position() + read );
071 //System.out.println("g-bb = " + bb);
072 return obj;
073 }
074
075
076 /**
077 * Put an Object to the ByteBuffer.
078 * If the object does not fit into the buffer a
079 * BufferOverflowException is thrown.
080 * @param obj the object to be put into the buffer.
081 */
082 public void put( Object obj ) throws IOException {
083 ByteArrayOutputStream os = new ByteArrayOutputStream();
084 ObjectOutputStream oos = new ObjectOutputStream( os );
085 oos.writeObject( obj );
086 oos.close();
087 //System.out.println("write = " + os.size());
088 bb.put( os.toByteArray() );
089 //System.out.println("p-bb = " + bb);
090 }
091
092
093 /**
094 * to String
095 */
096 public String toString() {
097 return "ObjectBuffer[" + bb.toString() + "]";
098 }
099
100 }