c# - 短计数读取时未能将其全部读入内存
问题描述
我的教科书说:
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);
解决方案
关于:
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()
,您应该只看到前三个字节发生变化(当然,假设文件的内容与内存中的内容不同)。
推荐阅读
- gremlin - How to increment an edge property counter in Gremlin graph
- google-compute-engine - GCE 实例的自定义元数据值是否安全存储?
- javascript - Javascript:通过其类名和类型同时获取输入
- python - Python:无法导入模块
- xml - 解析符合给定标准的一个孩子的 XML 和打印属性
- excel - VBA:具有两个工作簿的匹配功能
- webpack - 如何填写 Parcel Bundler?
- php - php 格式字段 datetime-local 到 php
- hql - 在 hibernate-5 中运行命名查询时,我将如何确保它使用 JPA2.1 标准
- ios - 如何在 UITableViewCell 中创建表格视图?具有可扩展功能