问题描述
我正在尝试通过对附加函数的大量调用来逐渐填充压缩缓冲区。每次调用该函数后,我想知道当前压缩流有多大。这样,一旦达到某个压缩大小,我就可以停止放入新数据。如果我只是追加输入数据并在每次 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()。但是在这样一个电话之后,我不能再重新连接流,所以我可以继续。
有人有想法吗?感谢您的帮助!
最好的问候,
对等
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)