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

io.servicecomb.foundation.vertx.stream.BufferOutputStream Maven / Gradle / Ivy

/*
 * Copyright 2017 Huawei Technologies Co., Ltd
 *
 * 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 io.servicecomb.foundation.vertx.stream;

import java.io.OutputStream;
import java.nio.charset.StandardCharsets;

import io.netty.buffer.ByteBuf;
import io.vertx.core.buffer.Buffer;

/**
 * BufferOutputStream
 *
 *
 */
public class BufferOutputStream extends OutputStream {
    private static final int DIRECT_BUFFER_SIZE = 1024;

    protected ByteBuf byteBuf;

    private boolean needReleaseBuffer;

    public BufferOutputStream() {
        // TODO:默认大小加配置项
        // TODO:如何与pool配合起来,vertx中默认都是unpool的,我们的阻塞模式下,申请与释放也不在一个线程,估计更用不上?
        //        后续通道没问题了,再来验证这个问题
        //        this(PooledByteBufAllocator.DEFAULT.directBuffer());

        //        this(PooledByteBufAllocator.DEFAULT.directBuffer(DIRECT_BUFFER_SIZE));

        //        this(UnpooledByteBufAllocator.DEFAULT.directBuffer(DIRECT_BUFFER_SIZE));
        //        needReleaseBuffer = false;

        //                this(UnpooledByteBufAllocator.DEFAULT.heapBuffer(DIRECT_BUFFER_SIZE));

        this(Buffer.buffer(DIRECT_BUFFER_SIZE).getByteBuf());
        needReleaseBuffer = false;
    }


    public BufferOutputStream(ByteBuf buffer) {
        this.byteBuf = buffer;
    }

    public ByteBuf getByteBuf() {
        return byteBuf;
    }

    public Buffer getBuffer() {
        return Buffer.buffer(byteBuf);
    }

    public int length() {
        return byteBuf.readableBytes();
    }

    public void writeByte(byte value) {
        byteBuf.writeByte(value);
    }

    // 实际是写byte
    @Override
    public void write(int byteValue) {
        byteBuf.writeByte((byte) byteValue);
    }

    public void write(boolean value) {
        byteBuf.writeBoolean(value);
    }

    public void writeInt(int pos, int value) {
        byteBuf.setInt(pos, value);
    }

    public void writeShort(short value) {
        byteBuf.writeShort(value);
    }

    public void writeInt(int value) {
        byteBuf.writeInt(value);
    }

    public void writeLong(long value) {
        byteBuf.writeLong(value);
    }

    public void writeString(String value) {
        byteBuf.writeInt(value.length());
        byteBuf.writeCharSequence(value, StandardCharsets.UTF_8);
    }

    public void write(byte[] b) {
        write(b, 0, b.length);
    }

    @Override
    public void write(byte[] bytes, int offset, int len) {
        byteBuf.writeBytes(bytes, offset, len);
    }

    @Override
    public void close() {
        if (needReleaseBuffer && byteBuf != null) {
            byteBuf.release();
        }
    }

    public int writerIndex() {
        return byteBuf.writerIndex();
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy