< prev index next >

src/java.base/share/classes/java/io/ByteArrayInputStream.java

Print this page

        

*** 1,7 **** /* ! * Copyright (c) 1994, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this --- 1,7 ---- /* ! * Copyright (c) 1994, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this
*** 23,76 **** * questions. */ package java.io; /** ! * A <code>ByteArrayInputStream</code> contains * 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 the <code>read</code> method. * <p> * Closing a {@code ByteArrayInputStream} has no effect. The methods in * this class can be called after the stream has been closed without * generating an {@code IOException}. * * @author Arthur van Hoff * @see java.io.StringBufferInputStream * @since 1.0 */ ! public ! class ByteArrayInputStream extends InputStream { /** * An array of bytes that was provided ! * by the creator of the stream. Elements <code>buf[0]</code> ! * through <code>buf[count-1]</code> are the * only bytes that can ever be read from the ! * stream; element <code>buf[pos]</code> 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 of <code>count</code>. * The next byte to be read from the input stream buffer ! * will be <code>buf[pos]</code>. */ 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 the <code>mark()</code> method. * The current buffer position is set to this point by the ! * <code>reset()</code> method. * <p> * If no mark has been set, then the value of mark is the offset * passed to the constructor (or 0 if the offset was not supplied). * * @since 1.1 --- 23,78 ---- * questions. */ package java.io; + import java.util.Arrays; + import java.util.Objects; + /** ! * A {@code ByteArrayInputStream} contains * 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 the {@code read} method. * <p> * Closing a {@code ByteArrayInputStream} has no effect. The methods in * this class can be called after the stream has been closed without * generating an {@code IOException}. * * @author Arthur van Hoff * @see java.io.StringBufferInputStream * @since 1.0 */ ! public class ByteArrayInputStream extends InputStream { /** * An array of bytes that was provided ! * by the creator of the stream. Elements {@code buf[0]} ! * through {@code buf[count-1]} are the * only bytes that can ever be read from the ! * stream; element {@code buf[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 of {@code count}. * The next byte to be read from the input stream buffer ! * will be {@code buf[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 the {@code mark()} method. * The current buffer position is set to this point by the ! * {@code reset()} method. * <p> * If no mark has been set, then the value of mark is the offset * passed to the constructor (or 0 if the offset was not supplied). * * @since 1.1
*** 79,120 **** /** * 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 of <code>buf</code>. * It is one greater than the position of ! * the last byte within <code>buf</code> that * can ever be read from the input stream buffer. */ protected int count; /** ! * Creates a <code>ByteArrayInputStream</code> ! * so that it uses <code>buf</code> as its * buffer array. * The buffer array is not copied. ! * The initial value of <code>pos</code> ! * is <code>0</code> and the initial value ! * of <code>count</code> is the length of ! * <code>buf</code>. * * @param buf the input buffer. */ public ByteArrayInputStream(byte buf[]) { this.buf = buf; this.pos = 0; this.count = buf.length; } /** ! * Creates <code>ByteArrayInputStream</code> ! * that uses <code>buf</code> as its ! * buffer array. The initial value of <code>pos</code> ! * is <code>offset</code> and the initial value ! * of <code>count</code> is the minimum of <code>offset+length</code> ! * and <code>buf.length</code>. * The buffer array is not copied. The buffer's mark is * set to the specified offset. * * @param buf the input buffer. * @param offset the offset in the buffer of the first byte to read. --- 81,122 ---- /** * 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 of {@code buf}. * It is one greater than the position of ! * the last byte within {@code buf} that * can ever be read from the input stream buffer. */ protected int count; /** ! * Creates a {@code ByteArrayInputStream} ! * so that it uses {@code buf} as its * buffer array. * The buffer array is not copied. ! * The initial value of {@code pos} ! * is {@code 0} and the initial value ! * of {@code count} is the length of ! * {@code buf}. * * @param buf the input buffer. */ public ByteArrayInputStream(byte buf[]) { this.buf = buf; this.pos = 0; this.count = buf.length; } /** ! * Creates {@code ByteArrayInputStream} ! * that uses {@code buf} as its ! * buffer array. The initial value of {@code pos} ! * is {@code offset} and the initial value ! * of {@code count} is the minimum of {@code offset+length} ! * and {@code buf.length}. * The buffer array is not copied. The buffer's mark is * set to the specified offset. * * @param buf the input buffer. * @param offset the offset in the buffer of the first byte to read.
*** 127,186 **** this.mark = offset; } /** * Reads the next byte of data from this input stream. The value ! * byte is returned as an <code>int</code> in the range ! * <code>0</code> to <code>255</code>. If no byte is available * because the end of the stream has been reached, the value ! * <code>-1</code> is returned. * <p> ! * This <code>read</code> method * cannot block. * ! * @return the next byte of data, or <code>-1</code> if the end of the * stream has been reached. */ public synchronized int read() { return (pos < count) ? (buf[pos++] & 0xff) : -1; } /** ! * Reads up to <code>len</code> bytes of data into an array of bytes * from this input stream. ! * If <code>pos</code> equals <code>count</code>, ! * then <code>-1</code> is returned to indicate ! * end of file. Otherwise, the number <code>k</code> * of bytes read is equal to the smaller of ! * <code>len</code> and <code>count-pos</code>. ! * If <code>k</code> is positive, then bytes ! * <code>buf[pos]</code> through <code>buf[pos+k-1]</code> ! * are copied into <code>b[off]</code> through ! * <code>b[off+k-1]</code> in the manner performed ! * by <code>System.arraycopy</code>. The ! * value <code>k</code> is added into <code>pos</code> ! * and <code>k</code> is returned. * <p> ! * This <code>read</code> method cannot block. * * @param b the buffer into which the data is read. ! * @param off the start offset in the destination array <code>b</code> * @param len the maximum number of bytes read. * @return the total number of bytes read into the buffer, or ! * <code>-1</code> if there is no more data because the end of * the stream has been reached. ! * @exception NullPointerException If <code>b</code> is <code>null</code>. ! * @exception IndexOutOfBoundsException If <code>off</code> is negative, ! * <code>len</code> is negative, or <code>len</code> is greater than ! * <code>b.length - off</code> */ public synchronized int read(byte b[], int off, int len) { ! if (b == null) { ! throw new NullPointerException(); ! } else if (off < 0 || len < 0 || len > b.length - off) { ! throw new IndexOutOfBoundsException(); ! } if (pos >= count) { return -1; } --- 129,184 ---- this.mark = offset; } /** * Reads the next byte of data from this input stream. The value ! * byte is returned as an {@code int} in the range ! * {@code 0} to {@code 255}. If no byte is available * because the end of the stream has been reached, the value ! * {@code -1} is returned. * <p> ! * This {@code read} method * cannot block. * ! * @return the next byte of data, or {@code -1} if the end of the * stream has been reached. */ public synchronized int read() { return (pos < count) ? (buf[pos++] & 0xff) : -1; } /** ! * Reads up to {@code len} bytes of data into an array of bytes * from this input stream. ! * If {@code pos} equals {@code count}, ! * then {@code -1} is returned to indicate ! * end of file. Otherwise, the number {@code k} * of bytes read is equal to the smaller of ! * {@code len} and {@code count-pos}. ! * If {@code k} is positive, then bytes ! * {@code buf[pos]} through {@code buf[pos+k-1]} ! * are copied into {@code b[off]} through ! * {@code b[off+k-1]} in the manner performed ! * by {@code System.arraycopy}. The ! * value {@code k} is added into {@code pos} ! * and {@code k} is returned. * <p> ! * This {@code read} method cannot block. * * @param b the buffer into which the data is read. ! * @param off the start offset in the destination array {@code b} * @param len the maximum number of bytes read. * @return the total number of bytes read into the buffer, or ! * {@code -1} if there is no more data because the end of * the stream has been reached. ! * @throws NullPointerException If {@code b} is {@code null}. ! * @throws IndexOutOfBoundsException If {@code off} is negative, ! * {@code len} is negative, or {@code len} is greater than ! * {@code b.length - off} */ public synchronized int read(byte b[], int off, int len) { ! Objects.checkFromIndexSize(off, len, b.length); if (pos >= count) { return -1; }
*** 194,211 **** System.arraycopy(buf, pos, b, off, len); pos += len; return len; } /** ! * Skips <code>n</code> bytes of input from this input stream. Fewer * bytes might be skipped if the end of the input stream is reached. ! * The actual number <code>k</code> * of bytes to be skipped is equal to the smaller ! * of <code>n</code> and <code>count-pos</code>. ! * The value <code>k</code> is added into <code>pos</code> ! * and <code>k</code> is returned. * * @param n the number of bytes to be skipped. * @return the actual number of bytes skipped. */ public synchronized long skip(long n) { --- 192,227 ---- System.arraycopy(buf, pos, b, off, len); pos += len; return len; } + public synchronized byte[] readAllBytes() { + byte[] result = Arrays.copyOfRange(buf, pos, count); + pos = count; + return result; + } + + public synchronized int readNBytes(byte[] b, int off, int len) { + int n = read(b, off, len); + return n == -1 ? 0 : n; + } + + public synchronized long transferTo(OutputStream out) throws IOException { + int pos0 = pos; + out.write(buf, pos, count - pos); + pos = count; + return count - pos0; + } + /** ! * Skips {@code n} bytes of input from this input stream. Fewer * bytes might be skipped if the end of the input stream is reached. ! * The actual number {@code k} * of bytes to be skipped is equal to the smaller ! * of {@code n} and {@code count-pos}. ! * The value {@code k} is added into {@code pos} ! * and {@code k} is returned. * * @param n the number of bytes to be skipped. * @return the actual number of bytes skipped. */ public synchronized long skip(long n) {
*** 220,243 **** /** * Returns the number of remaining bytes that can be read (or skipped over) * from this input stream. * <p> ! * The value returned is <code>count&nbsp;- pos</code>, * which is the number of bytes remaining to be read from the input buffer. * * @return the number of remaining bytes that can be read (or skipped * over) from this input stream without blocking. */ public synchronized int available() { return count - pos; } /** ! * Tests if this <code>InputStream</code> supports mark/reset. The ! * <code>markSupported</code> method of <code>ByteArrayInputStream</code> ! * always returns <code>true</code>. * * @since 1.1 */ public boolean markSupported() { return true; --- 236,259 ---- /** * Returns the number of remaining bytes that can be read (or skipped over) * from this input stream. * <p> ! * The value returned is {@code count - pos}, * which is the number of bytes remaining to be read from the input buffer. * * @return the number of remaining bytes that can be read (or skipped * over) from this input stream without blocking. */ public synchronized int available() { return count - pos; } /** ! * Tests if this {@code InputStream} supports mark/reset. The ! * {@code markSupported} method of {@code ByteArrayInputStream} ! * always returns {@code true}. * * @since 1.1 */ public boolean markSupported() { return true;
*** 251,261 **** * <p> * If no mark has been set, then the value of the mark is the * offset passed to the constructor (or 0 if the offset was not * supplied). * ! * <p> Note: The <code>readAheadLimit</code> for this class * has no meaning. * * @since 1.1 */ public void mark(int readAheadLimit) { --- 267,277 ---- * <p> * If no mark has been set, then the value of the mark is the * offset passed to the constructor (or 0 if the offset was not * supplied). * ! * <p> Note: The {@code readAheadLimit} for this class * has no meaning. * * @since 1.1 */ public void mark(int readAheadLimit) {
< prev index next >