/*
* Copyright (c) 2003-2010 The Regents of the University of California.
* All rights reserved.
*
* '$Author: welker $'
* '$Date: 2010-05-05 22:21:26 -0700 (Wed, 05 May 2010) $'
* '$Revision: 24234 $'
*
* Permission is hereby granted, without written agreement and without
* license or royalty fees, to use, copy, modify, and distribute this
* software and its documentation for any purpose, provided that the above
* copyright notice and the following two paragraphs appear in all copies
* of this software.
*
* IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY
* FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
* ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF
* THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE
* PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF
* CALIFORNIA HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES,
* ENHANCEMENTS, OR MODIFICATIONS.
*
*/
/**
* Class that implements a random access file for storing multiple objects that would take up too
* much room in memory. Used here for storing a collection of Strings (records) for very large
* text based data sets. When combined with the PersistentVector class and PersistentTableModel class
* this gives the ability to have tables of almost unlimited size (since only a vector pointing to
* locations in the object file is stored in RAM)
*/
package third_party;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.RandomAccessFile;
import java.io.Serializable;
public class ObjectFile {
/*
* the randomAccessFile used for storage
*/
RandomAccessFile dataFile;
/*
* the file name of the random access file
*/
String sFileName;
/*
* ObjectFile constructor note the the file is named 'ObjectFilen'
*/
public ObjectFile(String sName) throws IOException {
sFileName = sName;
File f = new File(sName);
if (f.exists())
f.delete();
dataFile = new RandomAccessFile(sName, "rw");
}
/*
* write an object to the ObjectFile returns file postion object was written
* to.
*/
public synchronized long writeObject(Serializable obj) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(obj);
oos.flush();
int datalen = baos.size();
// append record
long pos = dataFile.length();
dataFile.seek(pos);
// write the length of the output
dataFile.writeInt(datalen);
dataFile.write(baos.toByteArray());
baos = null;
oos = null;
return pos;
}
/*
* get the current object length
*/
public synchronized int getObjectLength(long lPos) throws IOException {
dataFile.seek(lPos);
return dataFile.readInt();
}
/*
* get an object from the object file
*/
public synchronized Object readObject(long lPos) throws IOException,
ClassNotFoundException {
dataFile.seek(lPos);
int datalen = dataFile.readInt();
if (datalen > dataFile.length()) {
throw new IOException("Data file is corrupted. datalen: " + datalen);
}
byte[] data = new byte[datalen];
dataFile.readFully(data);
ByteArrayInputStream bais = new ByteArrayInputStream(data);
ObjectInputStream ois = new ObjectInputStream(bais);
Object o = ois.readObject();
bais = null;
ois = null;
data = null;
return o;
}
/*
* get the current object File length
*/
public long length() throws IOException {
return dataFile.length();
}
/*
* close the objectFile
*/
public void close() throws IOException {
dataFile.close();
}
/*
* delete the ObjectFile
*/
public void delete() {
try {
dataFile.close();
File f = new File(sFileName);
if (f.exists())
f.delete();
} catch (Exception w) {
}
}
static public void main(String args[]) {
String testString = "This is a test!!!";
try {
ObjectFile of = new ObjectFile("ObjectFile");
long pos = of.writeObject(testString);
Object res = of.readObject(pos);
System.out.println("Result: " + (String) res);
} catch (Exception e) {
}
}
}