1 17 package com.Ostermiller.util; 18 19 import java.io.*; 20 import java.util.*; 21 22 30 public class ConcatReader extends Reader { 31 32 37 private int readerQueueIndex = 0; 38 39 44 private ArrayList<Reader> readerQueue = new ArrayList<Reader>(); 45 46 53 private Reader currentReader = null; 54 55 60 private boolean doneAddingReaders = false; 61 62 72 public void lastReaderAdded(){ 73 doneAddingReaders = true; 74 } 75 76 85 public void addReader(Reader in){ 86 synchronized(readerQueue){ 87 if (in == null) throw new NullPointerException (); 88 if (closed) throw new IllegalStateException ("ConcatReader has been closed"); 89 if (doneAddingReaders) throw new IllegalStateException ("Cannot add more readers - the last reader has already been added."); 90 readerQueue.add(in); 91 } 92 } 93 94 104 public void addReaders(Reader[] in){ 105 for (int i=0; i<in.length; i++){ 106 addReader(in[i]); 107 } 108 } 109 110 116 private Reader getCurrentReader(){ 117 if (currentReader == null && readerQueueIndex < readerQueue.size()){ 118 synchronized(readerQueue){ 119 currentReader = (Reader)readerQueue.get(readerQueueIndex); 122 } 123 } 124 return currentReader; 125 } 126 127 133 private void advanceToNextReader(){ 134 currentReader = null; 135 readerQueueIndex++; 136 } 137 138 143 private boolean closed = false; 144 145 156 public ConcatReader(){ 157 } 158 159 172 public ConcatReader(Reader in){ 173 addReader(in); 174 lastReaderAdded(); 175 } 176 177 191 public ConcatReader(Reader in1, Reader in2){ 192 addReader(in1); 193 addReader(in2); 194 lastReaderAdded(); 195 } 196 197 210 public ConcatReader(Reader[] in){ 211 addReaders(in); 212 lastReaderAdded(); 213 } 214 215 231 public int read() throws IOException { 232 if (closed) throw new IOException("Reader closed"); 233 int r = -1; 234 while (r == -1){ 235 Reader in = getCurrentReader(); 236 if (in == null){ 237 if (doneAddingReaders) return -1; 238 try { 239 Thread.sleep(100); 240 } catch (InterruptedException iox){ 241 throw new IOException("Interrupted"); 242 } 243 } else { 244 r = in.read(); 245 if (r == -1) advanceToNextReader(); 246 } 247 } 248 return r; 249 } 250 251 268 public int read(char[] cbuf) throws IOException { 269 return read(cbuf, 0, cbuf.length); 270 } 271 272 292 public int read(char[] cbuf, int off, int len) throws IOException { 293 if (off < 0 || len < 0 || off + len > cbuf.length) throw new IndexOutOfBoundsException (); 294 if (closed) throw new IOException("Reader closed"); 295 int r = -1; 296 while (r == -1){ 297 Reader in = getCurrentReader(); 298 if (in == null){ 299 if (doneAddingReaders) return -1; 300 try { 301 Thread.sleep(100); 302 } catch (InterruptedException iox){ 303 throw new IOException("Interrupted"); 304 } 305 } else { 306 r = in.read(cbuf, off, len); 307 if (r == -1) advanceToNextReader(); 308 } 309 } 310 return r; 311 } 312 313 329 public long skip(long n) throws IOException { 330 if (closed) throw new IOException("Reader closed"); 331 if (n <= 0) return 0; 332 long s = -1; 333 while (s <= 0){ 334 Reader in = getCurrentReader(); 335 if (in == null){ 336 if (doneAddingReaders) return 0; 337 try { 338 Thread.sleep(100); 339 } catch (InterruptedException iox){ 340 throw new IOException("Interrupted"); 341 } 342 } else { 343 s = in.skip(n); 344 if (s <= 0) { 354 s = ((read()==-1)?-1:1); 356 } 357 } 358 359 } 360 return s; 361 } 362 363 374 public boolean ready() throws IOException { 375 if (closed) throw new IOException("Reader closed"); 376 Reader in = getCurrentReader(); 377 if (in == null) return false; 378 return in.ready(); 379 } 380 381 391 public void close() throws IOException { 392 if (closed) return; 393 for (Iterator i=readerQueue.iterator(); i.hasNext();){ 394 ((Reader)i.next()).close(); 395 } 396 closed = true; 397 } 398 399 406 public void mark(int readlimit) throws IOException { 407 throw new IOException("Mark not supported"); 408 } 409 410 417 public void reset() throws IOException { 418 throw new IOException("Reset not supported"); 419 } 420 421 428 public boolean markSupported(){ 429 return false; 430 } 431 } 432 | Popular Tags |