Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * Copyright 1999-2101 Alibaba Group.
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *      http://www.apache.org/licenses/LICENSE-2.0
   *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
 package com.alibaba.simpleimage.io;
 
本代码专为图片缓存使用,故默认缓冲区设得比较大 非同步的ByteArrayOutputStream替换方案, 执行toByteArray()方法时返回的是只读的内部字节数组, 避免了没有必要的字节复制. 本代码移植自IBM developer works精彩文章, 参见package文档.

Author(s):
Michael Zhou
wendell
Version:
$Id: ByteArrayOutputStream.java 593 2004-02-26 13:47:19Z baobao $
 
 public class ByteArrayOutputStream extends OutputStream {
 
     private static final int DEFAULT_INITIAL_BUFFER_SIZE = 1024 * 150;
 
     // internal buffer
     private byte[]           buffer;
     private int              index;
     private int              capacity;
 
     // is the stream closed?
     private boolean          closed;
 
     // is the buffer shared?
     private boolean          shared;
 
     public ByteArrayOutputStream(){
         this();
     }
 
     public ByteArrayOutputStream(int initialBufferSize){
          = initialBufferSize;
          = new byte[];
     }
 
     public void write(int datumthrows IOException {
         if () {
             throw new IOException("Stream closed");
         } else {
             if ( >= ) {
                 // expand the internal buffer
                  = ( * 2) + 1;
 
                 byte[] tmp = new byte[];
 
                 System.arraycopy(, 0, tmp, 0, );
                  = tmp;
 
                 // the new buffer is not shared
                  = false;
             }
 
             // store the byte
             [++] = (bytedatum;
         }
     }
 
     public void write(byte[] dataint offsetint lengththrows IOException {
         if (data == null) {
             throw new NullPointerException();
         } else if ((offset < 0) || ((offset + length) > data.length) || (length < 0)) {
             throw new IndexOutOfBoundsException();
         } else if () {
             throw new IOException("Stream closed");
         } else {
             if (( + length) > ) {
                 // expand the internal buffer
                  = ( * 2) + length;
 
                 byte[] tmp = new byte[];
 
                 System.arraycopy(, 0, tmp, 0, );
                  = tmp;
 
                 // the new buffer is not shared
                  = false;
             }
 
             // copy in the subarray
             System.arraycopy(dataoffsetlength);
              += length;
        }
    }
    public void close() {
        // 为了保证错误处理,暂时不支持关闭
        // closed = true;
    }
    public void writeTo(OutputStream outthrows IOException {
        // write the internal buffer directly
        out.write(, 0, );
    }
    public ByteArray toByteArray() {
         = true;
        return new ByteArray(, 0, );
    }
    public InputStream toInputStream() {
        // return a stream reading from the shared internal buffer
         = true;
        return new ByteArrayInputStream(, 0, );
    }
    public void reset() throws IOException {
        if () {
            throw new IOException("Stream closed");
        } else {
            if () {
                // create a new buffer if it is shared
                 = new byte[];
                 = false;
            }
            // reset index
             = 0;
        }
    }
New to GrepCode? Check out our FAQ X