0

如果我正在读取字节数,我会这样做:

using (FileStream stream = new FileStream(filename, FileMode.Open, FileAccess.Read))
{
    int size = (int) stream.Length;
    BinaryReader br = new BinaryReader(stream);
    byte[] test = new byte[size];
    test = br.ReadBytes(size);
    br.Close();
}

但是由于我想阅读 Uint16,所以我很震惊:

using (FileStream stream = new FileStream(filename, FileMode.Open, FileAccess.Read))
{
    int size = (int) stream.Length;
    BinaryReader br = new BinaryReader(stream);
    float[] test = new byte[size/2];
    for (int i = 0; i < size/2; ++i)
    {
         test[i] = br.ReadUInt16();
    }
    br.Close();
}

有没有更快的方法一次读取整个文件,或者速度差异可以忽略不计?

4

2 回答 2

1

如果文件不是太大而无法放入内存,则将所有字节读入 MemoryStream 然后从该流中读取 Uint16 会更快。像这样:

byte[] data;
int size;
using (FileStream stream = new FileStream(filename, FileMode.Open, FileAccess.Read))
{
    size = (int) stream.Length;
    data = new byte[size];
    stream.Read(data, 0, size);
}

uint[] uintData = new uint[size / 2];
using (var memoryStream = new MemoryStream(data))
using (var reader = new BinaryReader(memoryStream))
    for (int i = 0; i < size / 2; i++)
        uintData[i] = reader.ReadUInt16();

// Done.
于 2012-05-03T20:42:38.073 回答
0

首先,您不需要这一行:

byte[] test = new byte[size];

因为以下行

test = br.ReadBytes(size);

指向test另一个数组。所以,

byte[] test = br.ReadBytes(size);

就够了。


关于您的问题:由于BinaryReader.ReadBytes只是Stream.Read在循环中执行 s (您可以使用 ILSpy 或查看参考源代码来验证这一点),我假设您的代码示例之间的性能差异可以忽略不计。可以肯定的是,我建议您进行一些测量

于 2012-05-03T20:44:43.997 回答