ByteArrayOutputStream源码分析
来源:互联网 发布:东莞百度seo排名优化 编辑:程序博客网 时间:2024/06/15 12:50
public class ByteArrayOutputStream extends OutputStream { /** * The buffer where data is stored. */ protected byte buf[]; /** * The number of valid bytes in the buffer. */ protected int count; /** * Creates a new byte array output stream. The buffer capacity is * initially 32 bytes, though its size increases if necessary. */ public ByteArrayOutputStream() { // 默认的数组长度为32 this(32); } /** * Creates a new byte array output stream, with a buffer capacity of * the specified size, in bytes. * * @param size the initial size. * @exception IllegalArgumentException if size is negative. */ public ByteArrayOutputStream(int size) { if (size < 0) { throw new IllegalArgumentException("Negative initial size: " + size); } buf = new byte[size]; } /** * Increases the capacity if necessary to ensure that it can hold * at least the number of elements specified by the minimum * capacity argument. * * @param minCapacity the desired minimum capacity * @throws OutOfMemoryError if {@code minCapacity < 0}. This is * interpreted as a request for the unsatisfiably large capacity * {@code (long) Integer.MAX_VALUE + (minCapacity - Integer.MAX_VALUE)}. */ private void ensureCapacity(int minCapacity) { // overflow-conscious code if (minCapacity - buf.length > 0) grow(minCapacity); } /** * The maximum size of array to allocate. * Some VMs reserve some header words in an array. * Attempts to allocate larger arrays may result in * OutOfMemoryError: Requested array size exceeds VM limit */ private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8; /** * Increases the capacity to ensure that it can hold at least the * number of elements specified by the minimum capacity argument. * * @param minCapacity the desired minimum capacity */ private void grow(int minCapacity) { // overflow-conscious code int oldCapacity = buf.length; int newCapacity = oldCapacity << 1; if (newCapacity - minCapacity < 0) newCapacity = minCapacity; if (newCapacity - MAX_ARRAY_SIZE > 0) newCapacity = hugeCapacity(minCapacity); buf = Arrays.copyOf(buf, newCapacity); } private static int hugeCapacity(int minCapacity) { if (minCapacity < 0) // overflow throw new OutOfMemoryError(); return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE; } /** * Writes the specified byte to this byte array output stream. * * @param b the byte to be written. */ public synchronized void write(int b) { ensureCapacity(count + 1); buf[count] = (byte) b; count += 1; } /** * Writes <code>len</code> bytes from the specified byte array * starting at offset <code>off</code> to this byte array output stream. * * @param b the data. * @param off the start offset in the data. * @param len the number of bytes to write. */ public synchronized void write(byte b[], int off, int len) { if ((off < 0) || (off > b.length) || (len < 0) || ((off + len) - b.length > 0)) { throw new IndexOutOfBoundsException(); } ensureCapacity(count + len); System.arraycopy(b, off, buf, count, len); count += len; } /** * Writes the complete contents of this byte array output stream to * the specified output stream argument, as if by calling the output * stream's write method using <code>out.write(buf, 0, count)</code>. * * @param out the output stream to which to write the data. * @exception IOException if an I/O error occurs. */ public synchronized void writeTo(OutputStream out) throws IOException { out.write(buf, 0, count); } /** * Resets the <code>count</code> field of this byte array output * stream to zero, so that all currently accumulated output in the * output stream is discarded. The output stream can be used again, * reusing the already allocated buffer space. * * @see java.io.ByteArrayInputStream#count */ public synchronized void reset() { count = 0; } /** * Creates a newly allocated byte array. Its size is the current * size of this output stream and the valid contents of the buffer * have been copied into it. * * @return the current contents of this output stream, as a byte array. * @see java.io.ByteArrayOutputStream#size() */ public synchronized byte toByteArray()[] { return Arrays.copyOf(buf, count); } /** * Returns the current size of the buffer. * * @return the value of the <code>count</code> field, which is the number * of valid bytes in this output stream. * @see java.io.ByteArrayOutputStream#count */ public synchronized int size() { return count; } /** * Converts the buffer's contents into a string decoding bytes using the * platform's default character set. The length of the new <tt>String</tt> * is a function of the character set, and hence may not be equal to the * size of the buffer. * * <p> This method always replaces malformed-input and unmappable-character * sequences with the default replacement string for the platform's * default character set. The {@linkplain java.nio.charset.CharsetDecoder} * class should be used when more control over the decoding process is * required. * * @return String decoded from the buffer's contents. * @since JDK1.1 */ public synchronized String toString() { return new String(buf, 0, count); } /** * Converts the buffer's contents into a string by decoding the bytes using * the named {@link java.nio.charset.Charset charset}. The length of the new * <tt>String</tt> is a function of the charset, and hence may not be equal * to the length of the byte array. * * <p> This method always replaces malformed-input and unmappable-character * sequences with this charset's default replacement string. The {@link * java.nio.charset.CharsetDecoder} class should be used when more control * over the decoding process is required. * * @param charsetName the name of a supported * {@link java.nio.charset.Charset charset} * @return String decoded from the buffer's contents. * @exception UnsupportedEncodingException * If the named charset is not supported * @since JDK1.1 */ public synchronized String toString(String charsetName) throws UnsupportedEncodingException { return new String(buf, 0, count, charsetName); } /** * Creates a newly allocated string. Its size is the current size of * the output stream and the valid contents of the buffer have been * copied into it. Each character <i>c</i> in the resulting string is * constructed from the corresponding element <i>b</i> in the byte * array such that: * <blockquote><pre> * c == (char)(((hibyte & 0xff) << 8) | (b & 0xff)) * </pre></blockquote> * * @deprecated This method does not properly convert bytes into characters. * As of JDK 1.1, the preferred way to do this is via the * <code>toString(String enc)</code> method, which takes an encoding-name * argument, or the <code>toString()</code> method, which uses the * platform's default character encoding. * * @param hibyte the high byte of each resulting Unicode character. * @return the current contents of the output stream, as a string. * @see java.io.ByteArrayOutputStream#size() * @see java.io.ByteArrayOutputStream#toString(String) * @see java.io.ByteArrayOutputStream#toString() */ @Deprecated public synchronized String toString(int hibyte) { return new String(buf, hibyte, 0, count); } /** * Closing a <tt>ByteArrayOutputStream</tt> has no effect. The methods in * this class can be called after the stream has been closed without * generating an <tt>IOException</tt>. */ public void close() throws IOException { }}
ByteArrayOutputStream主要注意几点
第一:ByteArrayOutputStream支持自动扩容,每次扩容的大小为原来的一倍。
第二:ByteArrayOutputStream是一个线程安全类。
第三:public synchronized void write(byte b[], int off, int len),当写入一个数组的时候,并没有使用的OutputStream默认的write,而是通过System.arraycopy(b, off, buf, count, len)实现,通过这种方法可以大大减小运行的时间,提高性能。
第四:ByteArrayOutputStream不需要结束调用close()和flush()。
阅读全文
0 0
- ByteArrayOutputStream 源码分析
- ByteArrayOutputStream源码分析
- Java IO:ByteArrayOutputStream使用详解及源码分析
- Java IO 系列源码分析——ByteArrayInputStream和ByteArrayOutputStream
- bytearrayoutputstream dataoutputstream分析
- Java8 I/O源码-ByteArrayOutputStream
- java io系列03之 ByteArrayOutputStream的简介,源码分析和示例(包括OutputStream)
- java io系列03之 ByteArrayOutputStream的简介,源码分析和示例(包括OutputStream)
- ByteArrayOutputStream
- ByteArrayOutputStream
- ByteArrayOutputStream
- ByteArrayOutputStream
- JDK 1.7 java.io 源码学习之ByteArrayInputStream和ByteArrayOutputStream
- JAVA IO源码学习系列一(ByteArrayOutputStream)
- ByteArrayOutputStream或ByteArrayInputStream不需要关闭流原因分析
- ByteArrayOutputStream用法
- ByteArrayOutputStream&ByteArrayInputStream
- ByteArrayOutputStream用法
- 什么是事务
- Mysql命令行执行sql文件,解决sqlyog或navicat执行sql文件乱码的问题
- 【小玩意】扫雷游戏
- REST简介
- Canvas的基本使用
- ByteArrayOutputStream源码分析
- 51Nod-1085 背包问题
- 同步工具(未完待更新)
- 2017.9.9 股票交易 思考记录
- MQ应用场景
- Python_学习错误集合(持续更新)
- 传感器实现仿微信摇一摇功能
- 【APIO2009T1】采油区域-分类讨论+动态规划
- jquery easyui datagrid改变参数