gpt4 book ai didi

c# - 使用 Stream.Read() 与 BinaryReader.Read() 处理二进制流

转载 作者:IT王子 更新时间:2023-10-29 04:43:35 24 4
gpt4 key购买 nike

在处理二进制流(即 byte[] 数组)时,使用 BinaryReaderBinaryWriter 的要点似乎是简化读取/从流中写入原始数据类型,使用 ReadBoolean() 等方法并考虑编码。这是整个故事吗?如果直接使用 Stream 而不使用 BinaryReader/BinaryWriter,是否存在固有优势或劣势?大多数方法,如 Read(),在两个类中似乎是相同的,我猜它们在底层的工作方式相同。

考虑一个以两种不同方式处理二进制文件的简单示例(编辑:我意识到这种方式无效并且可以使用缓冲区,这只是一个示例):

// Using FileStream directly
using (FileStream stream = new FileStream("file.dat", FileMode.Open))
{
// Read bytes from stream and interpret them as ints
int value = 0;
while ((value = stream.ReadByte()) != -1)
{
Console.WriteLine(value);
}
}


// Using BinaryReader
using (BinaryReader reader = new BinaryReader(FileStream fs = new FileStream("file.dat", FileMode.Open)))
{
// Read bytes and interpret them as ints
byte value = 0;
while (reader.BaseStream.Position < reader.BaseStream.Length)
{
value = reader.ReadByte();
Console.WriteLine(Convert.ToInt32(value));
}
}

输出将是相同的,但内部发生了什么(例如,从操作系统的角度来看)?一般而言,使用哪种实现方式重要吗?如果您不需要它们提供的额外方法,那么使用 BinaryReader/BinaryWriter 有什么意义吗?对于这种特定情况,MSDN 在 Stream.ReadByte() 方面这样说:

The default implementation on Stream creates a new single-byte array and then calls Read. While this is formally correct, it is inefficient.

使用 GC.GetTotalMemory(),第一种方法似乎分配的空间是第二种方法的 2 倍,但据我所知,如果更通用的 Stream使用 .Read() 方法(例如,使用缓冲区读取 block )。不过,在我看来,这些方法/接口(interface)可以很容易地统一起来......

最佳答案

不,这两种方法之间没有主要区别。额外的阅读器增加了一些缓冲,所以你不应该混合使用它们。但不要指望有任何显着的性能差异,这完全取决于实际的 I/O。

所以,

  • 当你(只有)byte[] 可以移动时使用流。在许多流媒体场景中很常见。
  • 当您有任何其他基本类型(包括简单的 byte)数据要处理时,请使用 BinaryWriter 和 BinaryReader。它们的主要目的是将内置框架类型转换为 byte[]

关于c# - 使用 Stream.Read() 与 BinaryReader.Read() 处理二进制流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17043631/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com