KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > ozoneDB > DxLib > DxObjectOutputStream


1 // You can redistribute this software and/or modify it under the terms of
2
// the Ozone Library License version 1 published by ozone-db.org.
3
//
4
// The original code and portions created by SMB are
5
// Copyright (C) 1997-@year@ by SMB GmbH. All rights reserved.
6
//
7
// $Id: DxObjectOutputStream.java,v 1.5 2000/10/28 16:55:14 daniela Exp $
8

9 package org.ozoneDB.DxLib;
10
11 import java.io.*;
12 import java.util.*;
13
14 /**
15  * Dieser Stream ist ein Ersatz fuer den Java-ObjectOutputStream. In gewissen
16  * Situationen ist er weniger speicherintensiv. Es koennen allerdings nur
17  * Objekte geschrieben werden, die das Externalizable-Interface implementieren.
18  *
19  *
20  * @author <a HREF="http://www.softwarebuero.de/">SMB</a>
21  * @version $Revision: 1.5 $Date: 2000/10/28 16:55:14 $
22  */

23 public class DxObjectOutputStream extends DataOutputStream implements ObjectOutput {
24     protected Hashtable table;
25     protected Hashtable classes;
26     
27     
28     public DxObjectOutputStream( OutputStream out ) {
29         super( new BufferedOutputStream( out, 4096 ) );
30         table = new Hashtable();
31         classes = new Hashtable();
32     }
33     
34     
35     public DxObjectOutputStream( OutputStream out, int bufferSize ) {
36         super( new BufferedOutputStream( out, bufferSize ) );
37         table = new Hashtable();
38         classes = new Hashtable();
39     }
40     
41     
42     public void reset() throws IOException {
43         table.clear();
44         classes.clear();
45         flush();
46     //System.out.println ("ObjOutputStream.reset()");
47
}
48     
49     
50     protected void writeClassName( Object JavaDoc obj ) throws IOException {
51         String JavaDoc cName = obj.getClass().getName();
52         Integer JavaDoc index = (Integer JavaDoc)classes.get( cName );
53         if (index == null) {
54             //neuer Klassenname
55
writeUTF( cName );
56             classes.put( cName, new Integer JavaDoc( classes.size() ) );
57         } else {
58             // Klassenname schon geschrieben
59
writeUTF( "+" );
60             writeShort( index.intValue() );
61         }
62     }
63     
64     
65     public void writeObject( Object JavaDoc obj ) throws IOException {
66         try {
67             // falls obj nicht init., wird beim lesen wieder mit null init.
68
if (obj == null) {
69                 writeUTF( "_" );
70                 //System.out.println ("writeObject(): null ");
71
return;
72             }
73             
74             if (!(obj instanceof Externalizable)) {
75                 throw new IOException( "Class " + obj.getClass().getName() + " doesn't implement Externalizable" );
76             }
77             
78             Integer JavaDoc hc = new Integer JavaDoc( System.identityHashCode( obj ) );
79             if (!table.containsKey( hc )) {
80                 // erst registrieren, sonst endlos-rekursion
81
table.put( hc, obj );
82                 // klassennamen speichern
83
writeClassName( obj );
84                 //System.out.println ("writeObject(): hashcode " + hc);
85
// hashCode als objID speichern
86
writeInt( hc.intValue() );
87                 // objekt selbst speichern
88
((Externalizable)obj).writeExternal( this );
89             } else {
90                 // obj schon gespeichert
91
writeUTF( ">" );
92                 // hashCode als objID speichern
93
writeInt( hc.intValue() );
94             //System.out.println ("writeObject(): hashCode ref " + hc);
95
}
96         } catch (IOException e) {
97             throw e;
98         } catch (Exception JavaDoc e) {
99             throw new IOException( e.toString() );
100         }
101     }
102 }
103
Popular Tags