memorystream(byte [])vs memorystream.write(byte [])

时间:2018-06-26 20:51:02

标签: c#

我需要在内存流中放入一个字节,所以最初,我使用了:

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);

有效。我不知道为什么为什么行得通?

1 个答案:

答案 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))
    {
        ...
    }
}