C# memorystream(字节[])与memorystream.write(字节[])

C# memorystream(字节[])与memorystream.write(字节[]),c#,C#,我需要将一个字节放入内存流,因此最初,我使用: byte[] Input; using (MemoryStream mem = new MemoryStream()) { mem.Write(Input, 0, (int)Input.Length); StreamReader stream = new StreamReader(mem); ... } 我想使用Streamreader从文本文件中读取行 它不起作用 然后我用 using (MemoryStream mem

我需要将一个字节放入内存流,因此最初,我使用:

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

成功了。我不知道为什么。为什么它能工作?

在第一种方法中,您使用
mem.Write(输入,0,(int)输入.长度)。请注意,设置写入数据后面的流读/写位置。在您的示例中,这相当于一个表示流结束的位置。再次尝试从MemoryStream读取不会返回任何数据,因为MemoryStream读取/写入位置位于流的末尾

在第二种方法中,您将
输入
字节数组作为参数传递给MemoryStream构造函数。通过构造函数提供字节数组不仅会使MemoryStream使用该字节数组,更重要的是,它会将初始流位置保持为零。因此,当尝试从以这种方式初始化的MemoryStream中读取时,输入字节数组中包含的数据将按预期返回


如何使用第一种方法解决问题?

在将数据写入MemoryStream后,只需将MemoryStream位置设置回预期/原始值(在您的示例中为零),即可使用第一种方法:

byte[] Input;
using (MemoryStream mem = new MemoryStream())
{
    mem.Write(Input, 0, (int)Input.Length);

    mem.Position = 0;

    using (StreamReader stream = new StreamReader(mem))
    {
        ...
    }
}

在第一种方法中,使用
mem.Write(Input,0,(int)Input.Length)。请注意,设置写入数据后面的流读/写位置。在您的示例中,这相当于一个表示流结束的位置。再次尝试从MemoryStream读取不会返回任何数据,因为MemoryStream读取/写入位置位于流的末尾

在第二种方法中,您将
输入
字节数组作为参数传递给MemoryStream构造函数。通过构造函数提供字节数组不仅会使MemoryStream使用该字节数组,更重要的是,它会将初始流位置保持为零。因此,当尝试从以这种方式初始化的MemoryStream中读取时,输入字节数组中包含的数据将按预期返回


如何使用第一种方法解决问题?

在将数据写入MemoryStream后,只需将MemoryStream位置设置回预期/原始值(在您的示例中为零),即可使用第一种方法:

byte[] Input;
using (MemoryStream mem = new MemoryStream())
{
    mem.Write(Input, 0, (int)Input.Length);

    mem.Position = 0;

    using (StreamReader stream = new StreamReader(mem))
    {
        ...
    }
}

如果您只想读取文本文件,您应该只使用
StreamReader
,而不要乱动MemoryStream…关于您的问题:
MemoryStream.Write
将流读/写位置更改为写入MemoryStream的数据后面(即流的结尾),在这种情况下,事后阅读它不会产生任何结果。将MemoryStream构造函数与字节数组一起使用会将流位置保持在零,因此读取工作正常。请再次尝试第一种方法,但在使用StreamReader之前将MemoryStream位置设置回零,这样也会工作。感谢您的建议。但从我在其他帖子中看到的情况来看,他们使用的是内存流。如果它是从文件路径读取的,那没关系,但我需要从字节数组中读取。好的,然后看我的第二条注释:)我明白了。非常感谢。如果您只想读取文本文件,您应该只使用
StreamReader
,而不要乱动MemoryStream…关于您的问题:
MemoryStream.Write
将流读/写位置更改为写入MemoryStream的数据后面(即流的结尾),在这种情况下,事后阅读它不会产生任何结果。将MemoryStream构造函数与字节数组一起使用会将流位置保持在零,因此读取工作正常。请再次尝试第一种方法,但在使用StreamReader之前将MemoryStream位置设置回零,这样也会工作。感谢您的建议。但从我在其他帖子中看到的情况来看,他们使用的是内存流。如果它是从文件路径读取的,那没关系,但我需要从字节数组中读取。好的,然后看我的第二条注释:)我明白了。非常感谢。