如何在通过过滤器链读取时禁用boost::iostreams缓冲区

How to disable boost::iostreams buffer when reading through a filter chain

本文关键字:boost iostreams 缓冲区 读取 过滤器      更新时间:2023-10-16

我有一些代码大致如下:

boost::iostreams::filtering_istreambuf in;
in.push(Lz4DecompressionFilter());
in.push(AesDecryptionFilter());
in.push(file_source("somefile"));

我已经有存储结果长度的元数据:

std::vector<char> buf;
buf.reserve(resultLength /* retrieved from a meta-data server */);
std::streamsize ret = in.read(buf, buf.capacity);

通过添加跟踪点,我观察到Lz4和Aes过滤器只能读取128字节。此外,如果我用自定义设备替换file_source,它只能读取4096个字节。

既然我确切地知道读取的大小,有没有一种方法可以完全禁用iostreams中的缓冲,并将读取链接到过滤器中?我知道我可以更改缓冲区大小,但我有兴趣完全禁用它们。

  • 根据定义,标准流使用缓冲区抽象。这在很大程度上是因为暴露的一些函数需要存在缓冲区(peek/putback)。

  • 如果没有缓冲,压缩和加密将如何工作?压缩和块密码都需要对(有时甚至是固定大小的)块进行操作。

  • 回复:

    此外,如果我用自定义设备替换file_source,它只能读取4096字节。

    你会期待什么样的行为?你期望无限大小的读数吗?

  • 在面向流的处理中,使用>4k的块是非常不寻常的。在这种情况下,是否只想先将所有输入复制到一个大缓冲区中(可能使用array_sink…)

真的,看起来你只是想增加缓冲区的大小是的。