在 ChipworkX 设备上,我们将使用以下命令读取文件:
File.ReadAllBytes(filename);
但是如果我们在内存小得多的 NetDuino Plus 上尝试这样做,
我们只会得到 OutOfMemoryException。
文件不是那么大,但我想在这种情况下这都是相对的(最大 1.5kb)。
在这样的设备上读取文件的正确方法是什么?
在 ChipworkX 设备上,我们将使用以下命令读取文件:
File.ReadAllBytes(filename);
但是如果我们在内存小得多的 NetDuino Plus 上尝试这样做,
我们只会得到 OutOfMemoryException。
文件不是那么大,但我想在这种情况下这都是相对的(最大 1.5kb)。
在这样的设备上读取文件的正确方法是什么?
用一个FileStream
using (var fileStream = new FileStream(filename, FileMode.Open))
{
byte[] block = new byte[1024];
int readLength;
while ((readLength = fileStream.Read(block, 0, block.Length)) > 0)
{
Process(block, readLength);
}
}
编写自己的Process
方法。块长度 1024 只是一个示例,一次读取尽可能大的块。您可以根据数据进行更改。
我假设您认为应该有足够的内存。如果是这样,我怀疑内部默认缓冲区大小会令人震惊。尝试在打开文件时明确说明缓冲区大小以使其与实际文件长度保持一致:
string path = //some path
byte[] buffer;
int bufferSize = (int)new FileInfo(path).Length;
using (FileStream fs = new FileStream(
path, FileMode.Open, FileAccess.Read, FileShare.Read, bufferSize))
{
buffer = new byte[bufferSize];
fs.Read(buffer, 0, buffer.Length);
}
//do stuff with buffer
当您使用内存有限的设备时,最好使用一个扇区大小的缓冲区。您正在做的是用速度换取内存。当您的内存很少时,您必须更慢地做事,而扇区是您可以使用的最小单位,这很有意义。
我建议使用 512 字节的缓冲区。