1
15
16 package gate.util;
17
18 import java.io.*;
19 import java.util.Iterator;
20 import java.util.LinkedList;
21
22
28 public class ObjectWriter extends Thread {
29
30
31 private static final boolean DEBUG = false;
32
33 public ObjectWriter(Object obj) throws IOException {
34 size = 0;
35 Writer writer = new Writer(obj);
36 InputStream is = writer.getInputStream();
37 writer.start();
38 boolean over = false;
39 buffer = new LinkedList();
40
41 int space = buffSize;
43
44 int writeOffset = 0;
46 byte lastBuff[] = new byte[buffSize];
47
48 while (!over) {
49 int read = is.read(lastBuff, writeOffset, space);
50 if(read == -1) {
51 lastOffset = writeOffset;
52 buffer.addLast(lastBuff);
53 over = true;
54 } else {
55 space-= read;
56 size+=read;
57 if(space == 0) {
58 buffer.addLast(lastBuff);
60 space = buffSize;
61 writeOffset = 0;
62 lastBuff = new byte[buffSize];
63 } else {
64 writeOffset+=read;
66 }
67 }
68 };
70 outputStream = new PipedOutputStream();
72
73 inputStream = new PipedInputStream(outputStream);
75 }
76
77
84 public InputStream getInputStream() {
85 return inputStream;
86 }
87
88
93 public int getSize() {
94 return size;
95 }
96
97
99 public void run() {
100 try{
101 Iterator buffIter = buffer.iterator();
102 while(buffIter.hasNext()){
103 byte currentBuff[] = (byte[])buffIter.next();
104 if(buffIter.hasNext()) {
105 outputStream.write(currentBuff,0,buffSize);
107 } else {
108 outputStream.write(currentBuff,0,lastOffset);
111 }
112 }
114 outputStream.flush();
115 outputStream.close();
116 } catch(IOException ioe) {
117 throw new RuntimeException(ioe.toString());
118 }
120 }
121
122
123
127 private class Writer extends Thread {
128 public Writer(Object _obj){
129 _object = _obj;
130 _outputStream = new PipedOutputStream();
131
132 try {
133 _inputStream = new PipedInputStream(_outputStream);
134 } catch(IOException ioe) {
135 ioe.printStackTrace(Err.getPrintWriter());
136 }
137 }
138
139 public InputStream getInputStream(){
140 return _inputStream;
141 }
142
143
146 public void run(){
147 try {
148 ObjectOutputStream _oos = new ObjectOutputStream(_outputStream);
149 _oos.writeObject(_object);
150 _oos.close();
151 } catch(IOException ioe) {
152 ioe.printStackTrace(Err.getPrintWriter());
153 }
154 }
155
156 private Object _object;
157 private InputStream _inputStream;
158 private PipedOutputStream _outputStream;
159
160 }
161
162 private Object object;
163
164 private InputStream inputStream ;
165
166 private PipedOutputStream outputStream;
167
168 private int size;
169
170 private int lastOffset;
171
172 private LinkedList buffer;
173
174 private int buffSize = 1024;
175
176 }