首页 > 解决方案 > 短计数读取时未能将其全部读入内存

问题描述

我的教科书说:

Read 从流中接收一个数据块到一个数组中。它返回接收到的字节数,它总是小于或等于 count 参数。如果它小于计数,则意味着已经到达流的末尾,或者流正在以较小的块为您提供数据(通常是网络流的情况)。在任何一种情况下,数组中的字节余额都将保持未写入状态,它们之前的值将被保留。使用 Read,只有当方法返回 0 时,您才能确定您已经到达流的末尾。因此,如果您有一个 1,000 字节的流,以下代码可能无法将其全部读入内存:

// Assuming s is a stream:
byte[] data = new byte [1000];
s.Read (data, 0, data.Length);

Read 方法可以读取 1 到 1,000 个字节之间的任何位置,而流的其余部分未读。

我很困惑,我编写了一个简单的 concolse 应用程序来验证:

//read.txt only contains 3 chars: abc
using (FileStream s = new FileStream("read.txt", FileMode.Open))
{
   byte[] data = new byte[5];
   int num = s.Read(data, 0, data.Length);
   foreach (byte b in data)
   {
      Console.WriteLine(b);
   }
}

输出是:

97

98

99

0

0

所以数据数组已经写入,为什么教科书上说“数组中的字节余额将保持未写入,可能无法将其全部读入内存”,

编辑:请丢弃我以前的控制台应用程序,我真正的问题是:

一个文件有 1000 个字节,我请求读取所有 1000 个字节:

byte[] data = new byte [1000];
s.Read (data, 0, data.Length);

为什么它可能无法将其全部读入内存?并且教科书还提供了读取所有1000个字节的正确方法:

byte[] data = new byte [1000];
int bytesRead = 0;
int chunkSize = 1;
while (bytesRead < data.Length && chunkSize > 0)
 bytesRead +=
 chunkSize = s.Read (data, bytesRead, data.Length - bytesRead);

标签: c#.netio

解决方案


关于:

byte[] data = new byte[5];
int num = s.Read(data, 0, data.Length);
foreach (byte b in data)

foreach将处理其中的每一个字节data(无论调用写入多少字节,总会Read()有五个字节)。

调用实际读取的字节数Read()被存储到num变量中,因此应该使用它来处理数据,例如(未经测试但可能足够简单以至于不保证它):

for (int i = 0; i < num; i++) {
    Console.WriteLine(data[i]);
}

根据您引用的文本,读取的字节之后的所有内容都可以是任意值,因为Read()调用没有更改它们。在您的情况下,它们显然在 the 之前为零Read(),因此仍然如此。

如果您要在foreach之前和之后运行该循环Read(),您应该只看到前三个字节发生变化(当然,假设文件的内容与内存中的内容不同)。


推荐阅读