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

org.mapdb.DataOutput2 Maven / Gradle / Ivy

The newest version!
/*
 *  Copyright (c) 2012 Jan Kotek
 *
 *  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 org.mapdb;

import java.io.DataOutput;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Arrays;

/**
  * Provides {@link DataOutput} implementation on top of growable {@code byte[]}
 * 

* {@link ByteArrayOutputStream} is not used as it requires {@code byte[]} copying * * @author Jan Kotek */ public final class DataOutput2 extends OutputStream implements DataOutput { public byte[] buf; public int pos; public DataOutput2(){ pos = 0; buf = new byte[16]; //TODO take hint from serializer for initial size } public DataOutput2(byte[] buf){ pos=0; this.buf = buf; } public byte[] copyBytes(){ return Arrays.copyOf(buf, pos); } /** * make sure there will be enought space in buffer to write N bytes */ public void ensureAvail(final int n) { if (pos + n >= buf.length) { int newSize = Math.max(pos + n, buf.length * 2); buf = Arrays.copyOf(buf, newSize); } } @Override public void write(final int b) throws IOException { ensureAvail(1); buf[pos++] = (byte) b; } @Override public void write(final byte[] b) throws IOException { write(b, 0, b.length); } @Override public void write(final byte[] b, final int off, final int len) throws IOException { ensureAvail(len); System.arraycopy(b, off, buf, pos, len); pos += len; } @Override public void writeBoolean(final boolean v) throws IOException { ensureAvail(1); buf[pos++] = (byte) (v ? 1 : 0); } @Override public void writeByte(final int v) throws IOException { ensureAvail(1); buf[pos++] = (byte) (v); } @Override public void writeShort(final int v) throws IOException { ensureAvail(2); buf[pos++] = (byte) (0xff & (v >> 8)); buf[pos++] = (byte) (0xff & (v)); } @Override public void writeChar(final int v) throws IOException { writeInt(v); } @Override public void writeInt(final int v) throws IOException { ensureAvail(4); buf[pos++] = (byte) (0xff & (v >> 24)); buf[pos++] = (byte) (0xff & (v >> 16)); buf[pos++] = (byte) (0xff & (v >> 8)); buf[pos++] = (byte) (0xff & (v)); } @Override public void writeLong(final long v) throws IOException { ensureAvail(8); buf[pos++] = (byte) (0xff & (v >> 56)); buf[pos++] = (byte) (0xff & (v >> 48)); buf[pos++] = (byte) (0xff & (v >> 40)); buf[pos++] = (byte) (0xff & (v >> 32)); buf[pos++] = (byte) (0xff & (v >> 24)); buf[pos++] = (byte) (0xff & (v >> 16)); buf[pos++] = (byte) (0xff & (v >> 8)); buf[pos++] = (byte) (0xff & (v)); } @Override public void writeFloat(final float v) throws IOException { ensureAvail(4); writeInt(Float.floatToIntBits(v)); } @Override public void writeDouble(final double v) throws IOException { ensureAvail(8); writeLong(Double.doubleToLongBits(v)); } @Override public void writeBytes(final String s) throws IOException { writeUTF(s); } @Override public void writeChars(final String s) throws IOException { writeUTF(s); } @Override public void writeUTF(final String s) throws IOException { final int len = s.length(); DataOutput2.packInt(this, len); for (int i = 0; i < len; i++) { int c = (int) s.charAt(i); DataOutput2.packInt(this, c); } } /** * Pack non-negative long into output stream. * It will occupy 1-10 bytes depending on value (lower values occupy smaller space) * * @param out DataOutput to put value into * @param value to be serialized, must be non-negative * @throws java.io.IOException */ static public void packLong(DataOutput out, long value) throws IOException { assert(value>=0):"negative value: "+value; while ((value & ~0x7FL) != 0) { out.write((((int) value & 0x7F) | 0x80)); value >>>= 7; } out.write((byte) value); } /** * Pack non-negative long into output stream. * It will occupy 1-5 bytes depending on value (lower values occupy smaller space) * * @param in DataOutput to put value into * @param value to be serialized, must be non-negative * @throws IOException */ static public void packInt(DataOutput in, int value) throws IOException { assert(value>=0):"negative value: "+value; while ((value & ~0x7F) != 0) { in.write(((value & 0x7F) | 0x80)); value >>>= 7; } in.write((byte) value); } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy