151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/*
269dae7ca4d593ff2ada99cf69696e782bcd46757Przemyslaw Szczepaniak * Copyright (c) 1994, 2013, Oracle and/or its affiliates. All rights reserved.
351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is free software; you can redistribute it and/or modify it
651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * under the terms of the GNU General Public License version 2 only, as
751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * published by the Free Software Foundation.  Oracle designates this
851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * particular file as subject to the "Classpath" exception as provided
951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * by Oracle in the LICENSE file that accompanied this code.
1051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
1151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is distributed in the hope that it will be useful, but WITHOUT
1251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
1451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * version 2 for more details (a copy is included in the LICENSE file that
1551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * accompanied this code).
1651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
1751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * You should have received a copy of the GNU General Public License version
1851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2 along with this work; if not, write to the Free Software Foundation,
1951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
2051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
2151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * or visit www.oracle.com if you need additional information or have any
2351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * questions.
2451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */
2551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
2651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipackage java.io;
2751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
2851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.Arrays;
2951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
3051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/**
3151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This class implements an output stream in which the data is
3251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * written into a byte array. The buffer automatically grows as data
3351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * is written to it.
3451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The data can be retrieved using <code>toByteArray()</code> and
3551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>toString()</code>.
3651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>
3751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Closing a <tt>ByteArrayOutputStream</tt> has no effect. The methods in
3851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * this class can be called after the stream has been closed without
3951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * generating an <tt>IOException</tt>.
4051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
4151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @author  Arthur van Hoff
4251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since   JDK1.0
4351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */
4451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
4551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipublic class ByteArrayOutputStream extends OutputStream {
4651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
4751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
4851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * The buffer where data is stored.
4951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
5051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    protected byte buf[];
5151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
5251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
5351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * The number of valid bytes in the buffer.
5451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
5551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    protected int count;
5651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
5751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
5851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Creates a new byte array output stream. The buffer capacity is
5951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * initially 32 bytes, though its size increases if necessary.
6051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
6151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public ByteArrayOutputStream() {
6251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        this(32);
6351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
6451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
6551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
6651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Creates a new byte array output stream, with a buffer capacity of
6751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * the specified size, in bytes.
6851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
6951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param   size   the initial size.
7051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @exception  IllegalArgumentException if size is negative.
7151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
7251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public ByteArrayOutputStream(int size) {
7351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (size < 0) {
7451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            throw new IllegalArgumentException("Negative initial size: "
7551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                                               + size);
7651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
7751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        buf = new byte[size];
7851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
7951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
8051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
8151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Increases the capacity if necessary to ensure that it can hold
8251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * at least the number of elements specified by the minimum
8351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * capacity argument.
8451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
8551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param minCapacity the desired minimum capacity
8651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws OutOfMemoryError if {@code minCapacity < 0}.  This is
8751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * interpreted as a request for the unsatisfiably large capacity
8851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * {@code (long) Integer.MAX_VALUE + (minCapacity - Integer.MAX_VALUE)}.
8951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
9051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private void ensureCapacity(int minCapacity) {
9151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // overflow-conscious code
9251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (minCapacity - buf.length > 0)
9351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            grow(minCapacity);
9451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
9551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
9651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
9769dae7ca4d593ff2ada99cf69696e782bcd46757Przemyslaw Szczepaniak     * The maximum size of array to allocate.
9869dae7ca4d593ff2ada99cf69696e782bcd46757Przemyslaw Szczepaniak     * Some VMs reserve some header words in an array.
9969dae7ca4d593ff2ada99cf69696e782bcd46757Przemyslaw Szczepaniak     * Attempts to allocate larger arrays may result in
10069dae7ca4d593ff2ada99cf69696e782bcd46757Przemyslaw Szczepaniak     * OutOfMemoryError: Requested array size exceeds VM limit
10169dae7ca4d593ff2ada99cf69696e782bcd46757Przemyslaw Szczepaniak     */
10269dae7ca4d593ff2ada99cf69696e782bcd46757Przemyslaw Szczepaniak    private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
10369dae7ca4d593ff2ada99cf69696e782bcd46757Przemyslaw Szczepaniak
10469dae7ca4d593ff2ada99cf69696e782bcd46757Przemyslaw Szczepaniak    /**
10551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Increases the capacity to ensure that it can hold at least the
10651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * number of elements specified by the minimum capacity argument.
10751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
10851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param minCapacity the desired minimum capacity
10951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
11051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private void grow(int minCapacity) {
11151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        // overflow-conscious code
11251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        int oldCapacity = buf.length;
11351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        int newCapacity = oldCapacity << 1;
11451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (newCapacity - minCapacity < 0)
11551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            newCapacity = minCapacity;
11669dae7ca4d593ff2ada99cf69696e782bcd46757Przemyslaw Szczepaniak        if (newCapacity - MAX_ARRAY_SIZE > 0)
11769dae7ca4d593ff2ada99cf69696e782bcd46757Przemyslaw Szczepaniak            newCapacity = hugeCapacity(minCapacity);
11851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        buf = Arrays.copyOf(buf, newCapacity);
11951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
12051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
12169dae7ca4d593ff2ada99cf69696e782bcd46757Przemyslaw Szczepaniak    private static int hugeCapacity(int minCapacity) {
12269dae7ca4d593ff2ada99cf69696e782bcd46757Przemyslaw Szczepaniak        if (minCapacity < 0) // overflow
12369dae7ca4d593ff2ada99cf69696e782bcd46757Przemyslaw Szczepaniak            throw new OutOfMemoryError();
12469dae7ca4d593ff2ada99cf69696e782bcd46757Przemyslaw Szczepaniak        return (minCapacity > MAX_ARRAY_SIZE) ?
12569dae7ca4d593ff2ada99cf69696e782bcd46757Przemyslaw Szczepaniak            Integer.MAX_VALUE :
12669dae7ca4d593ff2ada99cf69696e782bcd46757Przemyslaw Szczepaniak            MAX_ARRAY_SIZE;
12769dae7ca4d593ff2ada99cf69696e782bcd46757Przemyslaw Szczepaniak    }
12869dae7ca4d593ff2ada99cf69696e782bcd46757Przemyslaw Szczepaniak
12951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
13051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Writes the specified byte to this byte array output stream.
13151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
13251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param   b   the byte to be written.
13351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
13451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public synchronized void write(int b) {
13551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        ensureCapacity(count + 1);
13651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        buf[count] = (byte) b;
13751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        count += 1;
13851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
13951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
14051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
14151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Writes <code>len</code> bytes from the specified byte array
14251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * starting at offset <code>off</code> to this byte array output stream.
14351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
14451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param   b     the data.
14551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param   off   the start offset in the data.
14651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param   len   the number of bytes to write.
14751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
14851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public synchronized void write(byte b[], int off, int len) {
14951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if ((off < 0) || (off > b.length) || (len < 0) ||
15051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            ((off + len) - b.length > 0)) {
15151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            throw new IndexOutOfBoundsException();
15251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
15351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        ensureCapacity(count + len);
15451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        System.arraycopy(b, off, buf, count, len);
15551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        count += len;
15651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
15751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
15851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
15951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Writes the complete contents of this byte array output stream to
16051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * the specified output stream argument, as if by calling the output
16151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * stream's write method using <code>out.write(buf, 0, count)</code>.
16251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
16351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param      out   the output stream to which to write the data.
16451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @exception  IOException  if an I/O error occurs.
16551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
16651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public synchronized void writeTo(OutputStream out) throws IOException {
16751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        out.write(buf, 0, count);
16851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
16951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
17051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
17151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Resets the <code>count</code> field of this byte array output
17251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * stream to zero, so that all currently accumulated output in the
17351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * output stream is discarded. The output stream can be used again,
17451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * reusing the already allocated buffer space.
17551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
17651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see     java.io.ByteArrayInputStream#count
17751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
17851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public synchronized void reset() {
17951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        count = 0;
18051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
18151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
18251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
18351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Creates a newly allocated byte array. Its size is the current
18451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * size of this output stream and the valid contents of the buffer
18551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * have been copied into it.
18651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
18751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return  the current contents of this output stream, as a byte array.
18851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see     java.io.ByteArrayOutputStream#size()
18951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
19051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public synchronized byte toByteArray()[] {
19151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return Arrays.copyOf(buf, count);
19251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
19351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
19451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
19551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns the current size of the buffer.
19651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
19751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return  the value of the <code>count</code> field, which is the number
19851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *          of valid bytes in this output stream.
19951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see     java.io.ByteArrayOutputStream#count
20051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
20151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public synchronized int size() {
20251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return count;
20351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
20451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
20551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
20651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Converts the buffer's contents into a string decoding bytes using the
20751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * platform's default character set. The length of the new <tt>String</tt>
20851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * is a function of the character set, and hence may not be equal to the
20951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * size of the buffer.
21051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
21151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p> This method always replaces malformed-input and unmappable-character
21251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * sequences with the default replacement string for the platform's
21351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * default character set. The {@linkplain java.nio.charset.CharsetDecoder}
21451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * class should be used when more control over the decoding process is
21551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * required.
21651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
21751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return String decoded from the buffer's contents.
21851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @since  JDK1.1
21951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
22051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public synchronized String toString() {
22151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return new String(buf, 0, count);
22251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
22351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
22451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
22551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Converts the buffer's contents into a string by decoding the bytes using
22669dae7ca4d593ff2ada99cf69696e782bcd46757Przemyslaw Szczepaniak     * the named {@link java.nio.charset.Charset charset}. The length of the new
22769dae7ca4d593ff2ada99cf69696e782bcd46757Przemyslaw Szczepaniak     * <tt>String</tt> is a function of the charset, and hence may not be equal
22869dae7ca4d593ff2ada99cf69696e782bcd46757Przemyslaw Szczepaniak     * to the length of the byte array.
22951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
23051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p> This method always replaces malformed-input and unmappable-character
23151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * sequences with this charset's default replacement string. The {@link
23251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * java.nio.charset.CharsetDecoder} class should be used when more control
23351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * over the decoding process is required.
23451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
23569dae7ca4d593ff2ada99cf69696e782bcd46757Przemyslaw Szczepaniak     * @param      charsetName  the name of a supported
23669dae7ca4d593ff2ada99cf69696e782bcd46757Przemyslaw Szczepaniak     *             {@link java.nio.charset.Charset charset}
23769dae7ca4d593ff2ada99cf69696e782bcd46757Przemyslaw Szczepaniak     * @return     String decoded from the buffer's contents.
23851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @exception  UnsupportedEncodingException
23951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *             If the named charset is not supported
24069dae7ca4d593ff2ada99cf69696e782bcd46757Przemyslaw Szczepaniak     * @since      JDK1.1
24151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
24251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public synchronized String toString(String charsetName)
24351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        throws UnsupportedEncodingException
24451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    {
24551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return new String(buf, 0, count, charsetName);
24651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
24751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
24851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
24951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Creates a newly allocated string. Its size is the current size of
25051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * the output stream and the valid contents of the buffer have been
25151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * copied into it. Each character <i>c</i> in the resulting string is
25251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * constructed from the corresponding element <i>b</i> in the byte
25351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * array such that:
25451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <blockquote><pre>
25551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *     c == (char)(((hibyte &amp; 0xff) &lt;&lt; 8) | (b &amp; 0xff))
25651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * </pre></blockquote>
25751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
25851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @deprecated This method does not properly convert bytes into characters.
25951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * As of JDK&nbsp;1.1, the preferred way to do this is via the
26051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>toString(String enc)</code> method, which takes an encoding-name
26151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * argument, or the <code>toString()</code> method, which uses the
26251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * platform's default character encoding.
26351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
26451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param      hibyte    the high byte of each resulting Unicode character.
26551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return     the current contents of the output stream, as a string.
26651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see        java.io.ByteArrayOutputStream#size()
26751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see        java.io.ByteArrayOutputStream#toString(String)
26851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see        java.io.ByteArrayOutputStream#toString()
26951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
27051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    @Deprecated
27151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public synchronized String toString(int hibyte) {
27251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return new String(buf, hibyte, 0, count);
27351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
27451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
27551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
27651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Closing a <tt>ByteArrayOutputStream</tt> has no effect. The methods in
27751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * this class can be called after the stream has been closed without
27851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * generating an <tt>IOException</tt>.
27951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
28051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void close() throws IOException {
28151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
28251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
28351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski}
284