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

org.rx.io.HybridStream Maven / Gradle / Ivy

package org.rx.io;

import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.rx.core.Constants;

import java.io.InputStream;
import java.io.OutputStream;
import java.io.Serializable;

@Slf4j
public final class HybridStream extends IOStream implements Serializable {
    private static final long serialVersionUID = 2137331266386948293L;
    private final int maxMemorySize;
    private final String tempFilePath;
    private MemoryStream memoryStream = new MemoryStream(Constants.HEAP_BUF_SIZE, true);
    private FileStream fileStream;
    @Setter
    private String name;

    private synchronized IOStream getStream() {
        if (fileStream != null) {
            return fileStream;
        }
        if (memoryStream.getLength() > maxMemorySize) {
            log.info("Arrival MaxMemorySize[{}] threshold, switch FileStream", maxMemorySize);
            fileStream = tempFilePath == null ? new FileStream() : new FileStream(tempFilePath);
            fileStream.write(memoryStream.rewind());
            memoryStream.close();
            memoryStream = null;
            return fileStream;
        }
        return memoryStream;
    }

    @Override
    public String getName() {
        if (name == null) {
            return getStream().getName();
        }
        return name;
    }

    @Override
    protected InputStream initReader() {
        return null;
    }

    @Override
    protected OutputStream initWriter() {
        return null;
    }

    @Override
    public InputStream getReader() {
        return getStream().getReader();
    }

    @Override
    public OutputStream getWriter() {
        return getStream().getWriter();
    }

    @Override
    public boolean canSeek() {
        return getStream().canSeek();
    }

    @Override
    public boolean canWrite() {
        return getStream().canWrite();
    }

    @Override
    public long getPosition() {
        return getStream().getPosition();
    }

    @Override
    public void setPosition(long position) {
        getStream().setPosition(position);
    }

    @Override
    public long getLength() {
        return getStream().getLength();
    }

    public HybridStream() {
        this(Constants.MAX_HEAP_BUF_SIZE, null);
    }

    public HybridStream(int maxMemorySize, String tempFilePath) {
        this.maxMemorySize = maxMemorySize;
        this.tempFilePath = tempFilePath;
    }

    @Override
    protected void freeObjects() {
        getStream().close();
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy