如果我正在读字节数,我会这样做:
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();
}
是否有更快的方式一次读取整个文件或速度差异是否可以忽略?
答案 0 :(得分: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.
答案 1 :(得分:0)
首先,您不需要这一行:
byte[] test = new byte[size];
因为以下行
test = br.ReadBytes(size);
使test
指向另一个数组。所以,
byte[] test = br.ReadBytes(size);
就足够了。
关于你的问题:由于BinaryReader.ReadBytes
只是在循环中执行Stream.Read
(你可以用ILSpy或通过查看参考源代码来验证这一点),我会假设它们之间的性能差异您的代码示例可以忽略不计。可以肯定的是,我建议你做一些测量。