我需要在内存流中放入一个字节,所以最初,我使用了:
byte[] Input;
using (MemoryStream mem = new MemoryStream())
{
mem.Write(Input, 0, (int)Input.Length);
StreamReader stream = new StreamReader(mem);
...
}
我想使用Streamreader从文本文件中读取行。
没有用。
然后我用
using (MemoryStream mem = new MemoryStream(Input))
代替并删除
mem.Write(Input, 0, (int)Input.Length);
有效。我不知道为什么为什么行得通?
答案 0 :(得分:2)
在第一种方法中,您使用mem.Write(Input, 0, (int)Input.Length);
。请注意,MemoryStream.Write将流的读/写位置设置在已写数据之后。在您的示例中,这等同于表示流结束的位置。再次尝试从MemoryStream读取不会返回任何数据,因为MemoryStream的读/写位置位于流的末尾。
在第二种方法中,您将Input
字节数组作为参数传递给MemoryStream构造函数。通过构造函数提供字节数组不仅会使MemoryStream使用此字节数组,而且更重要的是,它将初始流位置保持为零。因此,当尝试从以这种方式初始化的MemoryStream中读取数据时,输入字节数组中包含的数据将按预期返回。
如何用第一种方法解决问题?
在将数据写入MemoryStream之后,只需将MemoryStream位置设置回预期/原始值(在您的示例中为零),就可以使MemoryStream.Write起作用的第一种方法:
byte[] Input;
using (MemoryStream mem = new MemoryStream())
{
mem.Write(Input, 0, (int)Input.Length);
mem.Position = 0;
using (StreamReader stream = new StreamReader(mem))
{
...
}
}