Java 1.8:使用 DeflaterInputStream 获取压缩时压缩的大小

时间:2021-01-22 12:07:29

标签: java stream inputstream deflatestream

我正在尝试通过对附加函数的大量调用来逐渐填充压缩缓冲区。每次调用该函数后,我想知道当前压缩流有多大。这样,一旦达到某个压缩大小,我就可以停止放入新数据。如果我只是追加输入数据并在每次 append() 时压缩所有累积的数据,我会遇到性能问题,因为我每次都必须从一开始就压缩整个数据。

我不知道怎么做。我尝试使用 PipedInputStream 和 PipedOutputStream,但问题是对 DeflaterInputStream.read() 的调用会阻塞,而且我没有看到预测是否会读取一个字节的方法。这是因为 DeflaterInputStream.available() 似乎总是返回 1,无论我是否可以读取一个字节。由于压缩流是压缩的,并不是每次我放入一个字节时都会得到一个字节。毕竟,这就是重点。

你们知道我能做什么吗?示例伪代码:

    protected DeflaterInputStream m_dis;
    protected PipedInputStream m_is;
    protected PipedOutputStream m_os;
    protected ByteArrayOutputStream m_out;

     protected void Init(int s32BufSize) {
        try
        {
            m_os = new PipedOutputStream();
            m_is = new PipedInputStream(m_os);
            m_dis = new DeflaterInputStream(m_is);
            m_out = new ByteArrayOutputStream();
        }
        catch (Exception ex)
        {

        }
    }

    public long append(byte[] appBytes) 
    {
        try
        {
            m_os.write(appBytes);
            m_os.flush();

            while (m_dis.available() > 0) // will always return 1
            {
                m_out.write(m_dis.read()); // read() may block, preventing next call to append()
                m_out.flush();
            }
        } catch (Exception ex) {
            System.out.println(ex.toString());
        }
        return m_out.size();
    }

我还尝试将读取从 m_dis 卸载到另一个线程。但是,读取然后阻塞,直到我调用 m_os.close()。但是在这样一个电话之后,我不能再重新连接流,所以我可以继续。

有人有想法吗?感谢您的帮助!

最好的问候,

对等

0 个答案:

没有答案