【发布时间】:2020-01-20 15:20:02
【问题描述】:
我想在使用Read 实例而不进行任何分配时跳过任意数量的字节。跳过后,我需要继续阅读后面的数据。
编译时不知道字节数,所以我无法创建固定数组。 Read 也没有跳过,所以我似乎需要阅读一些内容。我不想使用BufReader 并分配不必要的缓冲区,也不想逐字节读取,因为这样效率低下。
还有其他选择吗?
【问题讨论】:
-
没有,你应该忘记它,简短的版本是你需要一个缓冲区(堆栈或堆,没关系,但我建议你堆),因为你是用户所以在用户空间,内核将永远不允许任何用户代码在内核空间中运行,因此您需要一个缓冲区。此外,无论如何,就像您将在某些时候使用您的数据一样,您将需要一个缓冲区,所以答案是使用缓冲区。
-
@Stargateur 我使用过二进制协议,我实际上并不关心部分数据(但我知道它有多大)。这似乎是其中一种情况。
-
我只会读入堆栈上的一个数组(如果数组不够大,则在循环中)。所述数组的大小取决于您的平台和用例,但我可能会默认使用 1KB,除非我有充分的理由更好地调整它。
-
逐字节读取可能效率低下对于已经有内部缓冲区的流。如果没有缓冲区,逐字节是您可以读取流的唯一方式(除非它碰巧也实现了
Seek,正如 Shepmaster 的回答所指出的那样)。 -
@Stargateur“无论如何,你会在某个时候使用你的数据”......不。这正是提出这个问题的原因,因为我绝对不需要它并希望避免时间和空间的影响。
标签: rust