All Downloads are FREE. Search and download functionalities are using the official Maven repository.

eu.stratosphere.nephele.io.DataOutputBuffer Maven / Gradle / Ivy

/***********************************************************************************************************************
 * Copyright (C) 2010-2013 by the Stratosphere project (http://stratosphere.eu)
 *
 * 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.
 **********************************************************************************************************************/

/**
 * This file is based on source code from the Hadoop Project (http://hadoop.apache.org/), licensed by the Apache
 * Software Foundation (ASF) under the Apache License, Version 2.0. See the NOTICE file distributed with this work for
 * additional information regarding copyright ownership. 
 */

package eu.stratosphere.nephele.io;

import java.io.DataInput;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.ByteBuffer;

/**
 * A reusable {@link DataOutput} implementation that writes to an in-memory
 * buffer.
 * 

* This saves memory over creating a new DataOutputStream and ByteArrayOutputStream each time data is written. *

* Typical usage is something like the following: * *

 * 
 * DataOutputBuffer buffer = new DataOutputBuffer();
 * while (... loop condition ...) {
 *   buffer.reset();
 *   ... write buffer using DataOutput methods ...
 *   byte[] data = buffer.getData();
 *   int dataLength = buffer.getLength();
 *   ... write data to its ultimate destination ...
 * }
 * 
*/ public class DataOutputBuffer extends DataOutputStream { private static class ByteBufferedOutputStream extends OutputStream { private ByteBuffer buf; public ByteBuffer getData() { return this.buf; } public int getLength() { return this.buf.limit(); } public ByteBufferedOutputStream() { this(1024); } public ByteBufferedOutputStream(int size) { this.buf = ByteBuffer.allocate(size); this.buf.position(0); this.buf.limit(0); } public void reset() { this.buf.position(0); this.buf.limit(0); } public void write(DataInput in, int len) throws IOException { final int newcount = this.buf.limit() + len; if (newcount > this.buf.capacity()) { final ByteBuffer newBuf = ByteBuffer.allocate(Math.max(this.buf.capacity() << 1, newcount)); newBuf.position(0); System.arraycopy(this.buf.array(), 0, newBuf.array(), 0, this.buf.limit()); newBuf.limit(this.buf.limit()); this.buf = newBuf; } in.readFully(this.buf.array(), this.buf.limit(), len); this.buf.limit(newcount); } @Override public void write(byte[] b, int off, int len) throws IOException { final int newcount = this.buf.limit() + len; if (newcount > this.buf.capacity()) { increaseInternalBuffer(newcount); } System.arraycopy(b, off, this.buf.array(), this.buf.limit(), len); this.buf.limit(newcount); } @Override public void write(byte[] b) throws IOException { write(b, 0, b.length); } @Override public void write(int arg0) throws IOException { final int oldLimit = this.buf.limit(); final int newLimit = oldLimit + 1; if (newLimit > this.buf.capacity()) { increaseInternalBuffer(newLimit); } this.buf.limit(newLimit); this.buf.put(oldLimit, (byte) arg0); } private void increaseInternalBuffer(int minimumRequiredSize) { final ByteBuffer newBuf = ByteBuffer.allocate(Math.max(this.buf.capacity() << 1, minimumRequiredSize)); newBuf.position(0); System.arraycopy(this.buf.array(), 0, newBuf.array(), 0, this.buf.limit()); newBuf.limit(this.buf.limit()); this.buf = newBuf; } } private final ByteBufferedOutputStream byteBufferedOutputStream; /** Constructs a new empty buffer. */ public DataOutputBuffer() { this(new ByteBufferedOutputStream()); } public DataOutputBuffer(int size) { this(new ByteBufferedOutputStream(size)); } private DataOutputBuffer(ByteBufferedOutputStream byteBufferedOutputStream) { super(byteBufferedOutputStream); this.byteBufferedOutputStream = byteBufferedOutputStream; } public ByteBuffer getData() { return this.byteBufferedOutputStream.getData(); } public int getLength() { return this.byteBufferedOutputStream.getLength(); } /** Resets the buffer to empty. */ public DataOutputBuffer reset() { this.byteBufferedOutputStream.reset(); return this; } public void write(DataInput in, int length) throws IOException { this.byteBufferedOutputStream.write(in, length); } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy