Frames | No Frames |
1: /* ByteBufferOutputStream.java -- output stream with a growable underlying 2: byte buffer. 3: Copyright (C) 2006 Free Software Foundation, Inc. 4: 5: This file is a part of GNU Classpath. 6: 7: GNU Classpath is free software; you can redistribute it and/or modify 8: it under the terms of the GNU General Public License as published by 9: the Free Software Foundation; either version 2 of the License, or (at 10: your option) any later version. 11: 12: GNU Classpath is distributed in the hope that it will be useful, but 13: WITHOUT ANY WARRANTY; without even the implied warranty of 14: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15: General Public License for more details. 16: 17: You should have received a copy of the GNU General Public License 18: along with GNU Classpath; if not, write to the Free Software 19: Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 20: USA 21: 22: Linking this library statically or dynamically with other modules is 23: making a combined work based on this library. Thus, the terms and 24: conditions of the GNU General Public License cover the whole 25: combination. 26: 27: As a special exception, the copyright holders of this library give you 28: permission to link this library with independent modules to produce an 29: executable, regardless of the license terms of these independent 30: modules, and to copy and distribute the resulting executable under 31: terms of your choice, provided that you also meet, for each linked 32: independent module, the terms and conditions of the license of that 33: module. An independent module is a module which is not derived from 34: or based on this library. If you modify this library, you may extend 35: this exception to your version of the library, but you are not 36: obligated to do so. If you do not wish to do so, delete this 37: exception statement from your version. */ 38: 39: 40: package gnu.java.security.util; 41: 42: import java.io.IOException; 43: import java.io.OutputStream; 44: 45: import java.nio.ByteBuffer; 46: 47: /** 48: * An output stream that writes bytes to a ByteBuffer, which will be resized 49: * if more space is needed. 50: * 51: * @author Casey Marshall (csm@gnu.org) 52: */ 53: public class ByteBufferOutputStream extends OutputStream 54: { 55: private ByteBuffer buffer; 56: 57: public ByteBufferOutputStream() 58: { 59: this(256); 60: } 61: 62: public ByteBufferOutputStream(int initialCapacity) 63: { 64: buffer = ByteBuffer.allocate(initialCapacity); 65: } 66: 67: /* (non-Javadoc) 68: * @see java.io.OutputStream#write(int) 69: */ 70: public @Override synchronized void write(int b) throws IOException 71: { 72: if (!buffer.hasRemaining()) 73: growBuffer(); 74: buffer.put((byte) b); 75: } 76: 77: public @Override synchronized void write(byte[] b, int offset, int length) 78: { 79: if (buffer.remaining() < length) 80: growBuffer(); 81: buffer.put(b, offset, length); 82: } 83: 84: public @Override void write(byte[] b) 85: { 86: write(b, 0, b.length); 87: } 88: 89: /** 90: * Get the current state of the buffer. The returned buffer will have 91: * its position set to zero, its capacity set to the current limit, 92: * and its limit set to its capacity. 93: * 94: * @return The buffer. 95: */ 96: public ByteBuffer buffer() 97: { 98: return ((ByteBuffer) buffer.duplicate().flip()).slice(); 99: } 100: 101: public String toString() 102: { 103: return super.toString() + " [ buffer: " + buffer + " ]"; 104: } 105: 106: private void growBuffer() 107: { 108: int newCapacity = buffer.capacity(); 109: if (newCapacity < 16384) // If the buffer isn't huge yet, double its size 110: newCapacity = newCapacity << 1; 111: else // Otherwize, increment by a bit. 112: newCapacity += 4096; 113: ByteBuffer newBuffer = ByteBuffer.allocate(newCapacity); 114: buffer.flip(); 115: newBuffer.put(buffer); 116: buffer = newBuffer; 117: } 118: }