Methods Summary |
---|
public void | close()Closes this reader. Once it is closed, read operations on this reader
will throw an {@code IOException}. Only the first invocation of this
method has any effect.
synchronized (lock) {
if (isClosed()) {
return;
}
str = null;
}
|
private boolean | isClosed()Returns a boolean indicating whether this reader is closed.
return str == null;
|
public void | mark(int readLimit)Sets a mark position in this reader. The parameter {@code readLimit} is
ignored for this class. Calling {@code reset()} will reposition the
reader back to the marked position.
if (readLimit < 0) {
throw new IllegalArgumentException();
}
synchronized (lock) {
if (isClosed()) {
throw new IOException(Msg.getString("K0083")); //$NON-NLS-1$
}
markpos = pos;
}
|
public boolean | markSupported()Indicates whether this reader supports the {@code mark()} and {@code
reset()} methods. This implementation returns {@code true}.
return true;
|
public int | read()Reads a single character from the source string and returns it as an
integer with the two higher-order bytes set to 0. Returns -1 if the end
of the source string has been reached.
synchronized (lock) {
if (isClosed()) {
throw new IOException(Msg.getString("K0083")); //$NON-NLS-1$
}
if (pos != count) {
return str.charAt(pos++);
}
return -1;
}
|
public int | read(char[] buf, int offset, int len)Reads at most {@code len} characters from the source string and stores
them at {@code offset} in the character array {@code buf}. Returns the
number of characters actually read or -1 if the end of the source string
has been reached.
// BEGIN android-note
// changed array notation to be consistent with the rest of harmony
// END android-note
// avoid int overflow
// BEGIN android-changed
// Exception priorities (in case of multiple errors) differ from
// RI, but are spec-compliant.
// removed redundant check, added null check, used (offset | len) < 0
// instead of (offset < 0) || (len < 0) to safe one operation
if (buf == null) {
throw new NullPointerException(Msg.getString("K0047")); //$NON-NLS-1$
}
if ((offset | len) < 0 || len > buf.length - offset) {
throw new ArrayIndexOutOfBoundsException(Msg.getString("K002f")); //$NON-NLS-1$
}
// END android-changed
synchronized (lock) {
if (isClosed()) {
throw new IOException(Msg.getString("K0083")); //$NON-NLS-1$
}
if (pos == this.count) {
return -1;
}
int end = pos + len > this.count ? this.count : pos + len;
str.getChars(pos, end, buf, offset);
int read = end - pos;
pos = end;
return read;
}
|
public boolean | ready()Indicates whether this reader is ready to be read without blocking. This
implementation always returns {@code true}.
synchronized (lock) {
if (isClosed()) {
throw new IOException(Msg.getString("K0083")); //$NON-NLS-1$
}
return true;
}
|
public void | reset()Resets this reader's position to the last {@code mark()} location.
Invocations of {@code read()} and {@code skip()} will occur from this new
location. If this reader has not been marked, it is reset to the
beginning of the source string.
synchronized (lock) {
if (isClosed()) {
throw new IOException(Msg.getString("K0083")); //$NON-NLS-1$
}
pos = markpos != -1 ? markpos : 0;
}
|
public long | skip(long ns)Skips {@code amount} characters in the source string. Subsequent calls of
{@code read} methods will not return these characters unless {@code
reset()} is used.
synchronized (lock) {
if (isClosed()) {
throw new IOException(Msg.getString("K0083")); //$NON-NLS-1$
}
if (ns <= 0) {
return 0;
}
long skipped = 0;
if (ns < this.count - pos) {
pos = pos + (int) ns;
skipped = ns;
} else {
skipped = this.count - pos;
pos = this.count;
}
return skipped;
}
|