在使用二进制流(即数组)时,使用或似乎简化了从流中读取/写入原始数据类型的byte[]
要点,使用诸如编码之类的方法并考虑到编码。这就是故事的全部吗?如果一个人直接使用 a而不使用 ,是否存在固有的优势或劣势?大多数方法,例如,在两个类中似乎都是相同的,我猜它们在下面的工作方式相同。BinaryReader
BinaryWriter
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()
:
Stream 上的默认实现创建一个新的单字节数组,然后调用 Read。虽然这在形式上是正确的,但它是低效的。
使用GC.GetTotalMemory()
,第一种方法似乎分配的空间是第二种方法的 2 倍,但是如果使用更通用的Stream.Read()
方法(例如,使用缓冲区读取块),AFAIK 就不应该出现这种情况。尽管如此,在我看来,这些方法/接口可以很容易地统一......