package util; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.util.prefs.BackingStoreException; import java.util.prefs.Preferences; public class PrefObj { // Max byte count is 3/4 max string length (see Preferences // documentation). static private final int pieceLength = ( ( 3 * Preferences.MAX_VALUE_LENGTH ) / 4 ); static private byte[] object2Bytes( Object o ) throws IOException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream( baos ); oos.writeObject( o ); return baos.toByteArray(); } static private byte[][] breakIntoPieces( byte raw[] ) { int numPieces = ( raw.length + pieceLength - 1 ) / pieceLength; byte pieces[][] = new byte[ numPieces ][]; for ( int i = 0; i < numPieces; ++i ) { int startByte = i * pieceLength; int endByte = startByte + pieceLength; if ( endByte > raw.length ) endByte = raw.length; int length = endByte - startByte; pieces[ i ] = new byte[ length ]; System.arraycopy( raw, startByte, pieces[ i ], 0, length ); } return pieces; } static private void writePieces( Preferences prefs, String key, byte pieces[][] ) throws BackingStoreException { Preferences node = prefs.node( key ); node.clear(); for ( int i = 0; i < pieces.length; ++i ) { node.putByteArray( "" + i, pieces[ i ] ); } } static private byte[][] readPieces( Preferences prefs, String key ) throws BackingStoreException { Preferences node = prefs.node( key ); String keys[] = node.keys(); int numPieces = keys.length; byte pieces[][] = new byte[ numPieces ][]; for ( int i = 0; i < numPieces; ++i ) { pieces[ i ] = node.getByteArray( "" + i, null ); } return pieces; } static private byte[] combinePieces( byte pieces[][] ) { int length = 0; for ( int i = 0; i < pieces.length; ++i ) { length += pieces[ i ].length; } byte raw[] = new byte[ length ]; int cursor = 0; for ( int i = 0; i < pieces.length; ++i ) { System.arraycopy( pieces[ i ], 0, raw, cursor, pieces[ i ].length ); cursor += pieces[ i ].length; } return raw; } static private Object bytes2Object( byte raw[] ) throws IOException, ClassNotFoundException { ByteArrayInputStream bais = new ByteArrayInputStream( raw ); ObjectInputStream ois = new ObjectInputStream( bais ); Object o = ois.readObject(); return o; } static public void putObject( Preferences prefs, String key, Object o ) throws IOException, BackingStoreException, ClassNotFoundException { byte raw[] = object2Bytes( o ); byte pieces[][] = breakIntoPieces( raw ); writePieces( prefs, key, pieces ); } static public Object getObject( Preferences prefs, String key ) throws IOException, BackingStoreException, ClassNotFoundException { byte pieces[][] = readPieces( prefs, key ); byte raw[] = combinePieces( pieces ); Object o = bytes2Object( raw ); return o; } }