bloboutputstream.java

来自「RESIN 3.2 最新源码」· Java 代码 · 共 213 行

JAVA
213
字号
/* * Copyright (c) 1998-2008 Caucho Technology -- all rights reserved * * This file is part of Resin(R) Open Source * * Each copy or derived work must preserve the copyright notice and this * notice unmodified. * * Resin Open Source is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * Resin Open Source is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty * of NON-INFRINGEMENT.  See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License * along with Resin Open Source; if not, write to the * *   Free Software Foundation, Inc. *   59 Temple Place, Suite 330 *   Boston, MA 02111-1307  USA * * @author Scott Ferguson */package com.caucho.db.store;import com.caucho.vfs.TempBuffer;import java.io.IOException;import java.io.OutputStream;import java.io.InputStream;import java.util.logging.Logger;public class BlobOutputStream extends OutputStream {  private static final Logger log    = Logger.getLogger(BlobOutputStream.class.getName());  private StoreTransaction _xa;  private Store _store;    private TempBuffer _tempBuffer;  private byte []_buffer;  private int _offset;  private int _bufferEnd;  private Inode _inode;  private byte []_inodeBuffer;  private int _inodeOffset;    /**   * Creates a blob output stream.   *   * @param store the output store   */  public BlobOutputStream(Transaction xa, Store store,			  byte []inode, int inodeOffset)  {    init(store, inode, inodeOffset);    _xa = xa;  }    /**   * Creates a blob output stream.   *   * @param store the output store   */  public BlobOutputStream(Store store, byte []inode, int inodeOffset)  {    init(store, inode, inodeOffset);  }    /**   * Creates a blob output stream.   *   * @param store the output store   */  BlobOutputStream(Inode inode)  {    init(inode.getStore(), inode.getBuffer(), 0);    _inode = inode;  }  /**   * Initialize the output stream.   */  public void init(Store store, byte []inode, int inodeOffset)  {    _store = store;    _xa = RawTransaction.create();    _inodeBuffer = inode;    _inodeOffset = inodeOffset;    Inode.clear(_inodeBuffer, _inodeOffset);    _offset = 0;        _tempBuffer = TempBuffer.allocate();    _buffer = _tempBuffer.getBuffer();    _bufferEnd = _buffer.length;  }  /**   * Writes a byte.   */  public void write(int v)    throws IOException  {    if (_bufferEnd <= _offset) {      flushBlock();    }    _buffer[_offset++] = (byte) v;  }  /**   * Writes a buffer.   */  @Override  public void write(byte []buffer, int offset, int length)    throws IOException  {    while (length > 0) {      if (_bufferEnd <= _offset) {	flushBlock();      }      int sublen = _bufferEnd - _offset;      if (length < sublen)	sublen = length;      System.arraycopy(buffer, offset, _buffer, _offset, sublen);      offset += sublen;      _offset += sublen;      length -= sublen;    }  }  public void writeFromStream(InputStream is)    throws IOException  {    while (true) {      if (_bufferEnd <= _offset) {	flushBlock();      }      int sublen = _bufferEnd - _offset;      sublen = is.read(_buffer, _offset, sublen);      if (sublen < 0)	return;      _offset += sublen;    }  }  /**   * Completes the stream.   */  @Override  public void close()    throws IOException  {    try {      if (_tempBuffer == null)	return;            flushBlock();    } finally {      Inode inode = _inode;      _inode = null;            if (inode != null)	inode.closeOutputStream();      _inodeBuffer = null;      TempBuffer tempBuffer = _tempBuffer;      _tempBuffer = null;      if (tempBuffer != null) {	TempBuffer.free(tempBuffer);        tempBuffer = null;      }    }  }  /**   * Updates the buffer.   */  private void flushBlock()    throws IOException  {    int length = _offset;    _offset = 0;        Inode.append(_inodeBuffer, _inodeOffset,		 _store, _xa,		 _buffer, 0, length);  }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?