www.pudn.com > j2me_cldc-1_1-fcs-src-winunix.rar > ByteArrayInputStream.java
/* * Copyright © 2003 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. * */ package java.io; /** * AByteArrayInputStreamcontains * an internal buffer that contains bytes that * may be read from the stream. An internal * counter keeps track of the next byte to * be supplied by thereadmethod. * * @author Arthur van Hoff, Nik Shaylor * @version 12/17/01 (CLDC 1.1) * @since JDK1.0, CLDC 1.0 */ public class ByteArrayInputStream extends InputStream { /** * An array of bytes that was provided * by the creator of the stream. Elementsbuf[0]* throughbuf[count-1]are the * only bytes that can ever be read from the * stream; elementbuf[pos]is * the next byte to be read. */ protected byte buf[]; /** * The index of the next character to read from the input stream buffer. * This value should always be nonnegative * and not larger than the value ofcount. * The next byte to be read from the input stream buffer * will bebuf[pos]. */ protected int pos; /** * The currently marked position in the stream. * ByteArrayInputStream objects are marked at position zero by * default when constructed. They may be marked at another * position within the buffer by themark()method. * The current buffer position is set to this point by the *reset()method. * * @since JDK1.1 */ protected int mark = 0; /** * The index one greater than the last valid character in the input * stream buffer. * This value should always be nonnegative * and not larger than the length ofbuf. * It is one greater than the position of * the last byte withinbufthat * can ever be read from the input stream buffer. */ protected int count; /** * Creates aByteArrayInputStream* so that it usesbufas its * buffer array. * The buffer array is not copied. * The initial value ofpos* is0and the initial value * ofcountis the length of *buf. * * @param buf the input buffer. */ public ByteArrayInputStream(byte buf[]) { this.buf = buf; this.pos = 0; this.count = buf.length; } /** * CreatesByteArrayInputStream* that usesbufas its * buffer array. The initial value ofpos* isoffsetand the initial value * ofcountisoffset+length. * The buffer array is not copied. ** Note that if bytes are simply read from * the resulting input stream, elements
buf[pos]* throughbuf[pos+len-1]will * be read; however, if areset* operation is performed, then bytesbuf[0]* through buf[pos-1]will then * become available for input. * * @param buf the input buffer. * @param offset the offset in the buffer of the first byte to read. * @param length the maximum number of bytes to read from the buffer. */ public ByteArrayInputStream(byte buf[], int offset, int length) { this.buf = buf; this.pos = offset; this.count = Math.min(offset + length, buf.length); this.mark = offset; } /** * Reads the next byte of data from this input stream. The value * byte is returned as anintin the range *0to255. If no byte is available * because the end of the stream has been reached, the value *-1is returned. ** This
readmethod * cannot block. * * @return the next byte of data, or-1if the end of the * stream has been reached. */ public synchronized int read() { return (pos < count) ? (buf[pos++] & 0xff) : -1; } /** * Reads up tolenbytes of data into an array of bytes * from this input stream. * Ifposequalscount, * then-1is returned to indicate * end of file. Otherwise, the numberk* of bytes read is equal to the smaller of *lenandcount-pos. * Ifkis positive, then bytes *buf[pos]throughbuf[pos+k-1]* are copied intob[off]through *b[off+k-1]in the manner performed * bySystem.arraycopy. The * valuekis added intopos* andkis returned. ** This
readmethod cannot block. * * @param b the buffer into which the data is read. * @param off the start offset of the data. * @param len the maximum number of bytes read. * @return the total number of bytes read into the buffer, or *-1if there is no more data because the end of * the stream has been reached. */ public synchronized int read(byte b[], int off, int len) { if (b == null) { throw new NullPointerException(); } else if ((off < 0) || (off > b.length) || (len < 0) || ((off + len) > b.length) || ((off + len) < 0)) { throw new IndexOutOfBoundsException(); } if (pos >= count) { return -1; } if (pos + len > count) { len = count - pos; } if (len <= 0) { return 0; } System.arraycopy(buf, pos, b, off, len); pos += len; return len; } /** * Skipsnbytes of input from this input stream. Fewer * bytes might be skipped if the end of the input stream is reached. * The actual numberk* of bytes to be skipped is equal to the smaller * ofnandcount-pos. * The valuekis added intopos* andkis returned. * * @param n the number of bytes to be skipped. * @return the actual number of bytes skipped. */ public synchronized long skip(long n) { if (pos + n > count) { n = count - pos; } if (n < 0) { return 0; } pos += n; return n; } /** * Returns the number of bytes that can be read from this input * stream without blocking. * The value returned is *count - pos, * which is the number of bytes remaining to be read from the input buffer. * * @return the number of bytes that can be read from the input stream * without blocking. */ public synchronized int available() { return count - pos; } /** * Tests if ByteArrayInputStream supports mark/reset. * * @since JDK1.1 */ public boolean markSupported() { return true; } /** * Set the current marked position in the stream. * ByteArrayInputStream objects are marked at position zero by * default when constructed. They may be marked at another * position within the buffer by this method. * * @since JDK1.1 */ public void mark(int readAheadLimit) { mark = pos; } /** * Resets the buffer to the marked position. The marked position * is the beginning unless another position was marked. * The value ofposis set to 0. */ public synchronized void reset() { pos = mark; } /** * Closes this input stream and releases any system resources * associated with the stream. **/ public synchronized void close() throws IOException { } }