Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  package com.thaiopensource.validate.auto;
  
  
  public class RewindableInputStream extends InputStream implements Rewindable {
    static class Block {
      Block next;
      final byte[] buf;
     int used = 0;
     static final int MIN_SIZE = 1024;
     Block(int minSize) {
        = new byte[Math.max(minSize)];
     }
 
     Block() {
       this(0);
     }
 
     void append(byte b) {
       [++] = b;
     }
 
     void append(byte[] bint offint len) {
       System.arraycopy(bofflen);
        += len;
     }
   }
 
   private Block head;
  
If curBlockAvail > 0, then there are curBlockAvail bytes available to be returned starting at curBlockPos in curBlock.buf.
 
   private int curBlockAvail;
   private Block curBlock;
   private int curBlockPos;
   private Block lastBlock;
  
true unless willNotRewind has been called
 
   private boolean saving = true;
   private final InputStream in;
   private boolean pretendClosed = false;
  
true if we have got an EOF from the underlying InputStream
 
   private boolean eof;
 
   public RewindableInputStream(InputStream in) {
     if (in == null)
       throw new NullPointerException();
     this. = in;
   }
 
   public void close() throws IOException {
     if () {
        = 0;
        = null;
        = true;
     }
     else {
        = null;
        = null;
        = null;
        = false;
        = 0;
       .close();
     }
   }
 
   public void rewind() {
     if (!)
       throw new IllegalStateException("rewind() after willNotRewind()");
      = false;
     if ( == null)
       return;
      = ;
      = 0;
   }
 
   public boolean canRewind() {
     return ;
   }
 
   public void willNotRewind() {
      = false;
      = null;
      = null;
     if () {
        = false;
       try {
         .close();
       }
       catch (IOException e) { }
     }
   }
 
  public int read() throws IOException {
    if ( > 0) {
      int c = .[++] & 0xFF;
      --;
      if ( == 0) {
         = .;
        if ( != null) {
           = 0;
           = .;
        }
      }
      return c;
    }
    int c = .read();
    if ( && c != -1) {
      if ( == null)
         =  = new Block();
      else if (. == ..)
         = . = new Block();
      .append((byte)c);
    }
    return c;
  }
  public int read(byte b[], int offint lenthrows IOException {
    if ( == 0 && !)
      return .read(bofflen);
    if (b == null)
      throw new NullPointerException();
    if (len < 0)
      throw new IndexOutOfBoundsException();
    int nRead = 0;
    if ( != 0) {
      for (;;) {
        if (len == 0)
          return nRead;
        b[off++] = .[++];
        --len;
        nRead++;
        --;
        if ( == 0) {
           = .;
          if ( == null)
            break;
           = .;
           = 0;
        }
      }
    }
    if (len == 0)
      return nRead;
    if ()
      return nRead > 0 ? nRead : -1;
    try {
      int n = .read(bofflen);
      if (n < 0) {
         = true;
        return nRead > 0 ? nRead : -1;
      }
      nRead += n;
      if () {
        if ( == null)
           =  = new Block(n);
        else if (.. - . < n) {
          if (. != ..) {
            int free = .. - .;
            .append(bofffree);
            off += free;
            n -= free;
          }
           = . = new Block(n);
        }
        .append(boffn);
      }
    }
    catch (IOException e) {
       = true;
      if (nRead == 0)
        throw e;
    }
    return nRead;
  }
  public int available() throws IOException {
    if ( == 0)
      return .available();
    int n = ;
    for (Block b = .b != nullb = b.next)
      n += b.used;
    return n + .available();
  }
New to GrepCode? Check out our FAQ X