/**
  * Marks the read limit of the StringReader.
  *
  * @param limit the maximum limit of bytes that can be read before the mark position becomes
  *     invalid
  */
 public synchronized void mark(final int limit) {
   try {
     in.mark(limit);
   } catch (IOException ioe) {
     throw new RuntimeException(ioe.getMessage());
   }
 }
 /**
  * @return the current number of bytes ready for reading
  * @exception IOException if an error occurs
  */
 public synchronized int available() throws IOException {
   if (in == null) {
     throw new IOException("Stream Closed");
   }
   if (slack != null) {
     return slack.length - begin;
   }
   if (in.ready()) {
     return 1;
   } else {
     return 0;
   }
 }
 /**
  * Closes the Stringreader.
  *
  * @exception IOException if the original StringReader fails to be closed
  */
 public synchronized void close() throws IOException {
   if (in != null) {
     in.close();
     slack = null;
     in = null;
   }
 }
 /**
  * Resets the StringReader.
  *
  * @exception IOException if the StringReader fails to be reset
  */
 public synchronized void reset() throws IOException {
   if (in == null) {
     throw new IOException("Stream Closed");
   }
   slack = null;
   in.reset();
 }
  /**
   * Reads from the <code>Reader</code> into a byte array
   *
   * @param b the byte array to read into
   * @param off the offset in the byte array
   * @param len the length in the byte array to fill
   * @return the actual number read into the byte array, -1 at the end of the stream
   * @exception IOException if an error occurs
   */
  public synchronized int read(byte[] b, int off, int len) throws IOException {
    if (in == null) {
      throw new IOException("Stream Closed");
    }
    if (len == 0) {
      return 0;
    }
    if (encoding == null) {
      return castingRead(b, off, len);
    }
    while (slack == null) {
      char[] buf = new char[len]; // might read too much
      int n = in.read(buf);
      if (n == -1) {
        return -1;
      }
      if (n > 0) {
        slack = new String(buf, 0, n).getBytes(encoding);
        begin = 0;
      }
    }

    if (len > slack.length - begin) {
      len = slack.length - begin;
    }

    System.arraycopy(slack, begin, b, off, len);

    if ((begin += len) >= slack.length) {
      slack = null;
    }

    return len;
  }
 // Old version simply casts.  Must still be used for hashing unless
 // change polling version
 private int castingRead(byte[] outputBuf, int off, int len) throws IOException {
   if (charBuffer == null) {
     charBuffer = new char[DEFAULT_BUFFER_CAPACITY];
   }
   if (len > DEFAULT_BUFFER_CAPACITY) {
     len = DEFAULT_BUFFER_CAPACITY;
   }
   int numRead = in.read(charBuffer, 0, len);
   for (int ix = 0; ix < numRead; ix++) {
     outputBuf[off + ix] = (byte) charBuffer[ix];
   }
   return numRead;
 }
示例#7
0
 // Utility methods
 // ---------------
 // Get the next character, throwing an unchecked exception on error.
 private char next() {
   try {
     int i = (saved != 0) ? saved : r.read();
     saved = 0;
     if (i <= -1) {
       if (body_only) return ']'; // Just a little hacky.
       throw eof;
     }
     return (char) i;
   } catch (RuntimeException e) {
     throw e;
   } catch (Exception e) {
     throw new RuntimeException(e);
   }
 }