Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用StreamWriter写入MemoryStream返回空_C#_Memorystream_Streamwriter - Fatal编程技术网

C# 使用StreamWriter写入MemoryStream返回空

C# 使用StreamWriter写入MemoryStream返回空,c#,memorystream,streamwriter,C#,Memorystream,Streamwriter,我不确定我做错了什么,已经看到了很多例子,但似乎无法让这个工作 public static Stream Foo() { var memStream = new MemoryStream(); var streamWriter = new StreamWriter(memStream); for (int i = 0; i < 6; i++) streamWriter.WriteLine("TEST"); memStream.Seek(0

我不确定我做错了什么,已经看到了很多例子,但似乎无法让这个工作

public static Stream Foo()
{
    var memStream = new MemoryStream();
    var streamWriter = new StreamWriter(memStream);

    for (int i = 0; i < 6; i++)
        streamWriter.WriteLine("TEST");

    memStream.Seek(0, SeekOrigin.Begin);
    return memStream;
}
publicstaticstreamfoo()
{
var memStream=new MemoryStream();
var streamWriter=新的streamWriter(memStream);
对于(int i=0;i<6;i++)
streamWriter.WriteLine(“测试”);
memStream.Seek(0,SeekOrigin.Begin);
返回memStream;
}
我正在对这个方法做一个简单的测试,试图让它通过,但不管怎样,我的收集计数是0

[Test]
public void TestStreamRowCount()
{
    var stream = Foo();

    using (var reader = new StreamReader(stream))
    {
        var collection = new List<string>();
        string input;

        while ((input = reader.ReadLine()) != null)
            collection.Add(input);

        Assert.AreEqual(6, collection.Count);
    }
}
[测试]
public void TestStreamRowCount()
{
var stream=Foo();
使用(变量读取器=新的流读取器(流))
{
var collection=新列表();
字符串输入;
while((input=reader.ReadLine())!=null)
集合。添加(输入);
Assert.AreEqual(6,collection.Count);
}
}

注意:我在没有在测试方法中编译的情况下更改了上面的一些语法。更重要的是第一个方法似乎返回一个空流(我的reader.ReadLine()总是读取一次)。不知道我做错了什么。谢谢。

您忘记刷新您的
StreamWriter
实例

public static Stream Foo()
{
    var memStream = new MemoryStream();
    var streamWriter = new StreamWriter(memStream);

    for (int i = 0; i < 6; i++)
        streamWriter.WriteLine("TEST");

    streamWriter.Flush();                                   <-- need this
    memStream.Seek(0, SeekOrigin.Begin);
    return memStream;
}

写入行后,请尝试刷新streamWriter。

因为您没有使用“使用”或streamWriter。Flush()编写器没有提交对流的更改。结果流itslef还没有数据。通常,您希望使用using将操作与Stream和StremaWriter实例包装在一起

您还应该考虑返回内存流的新实例:

using(var memStream = new MemoryStream())
{
   ....
   return new MemoryStream(memStream.ToArray(), false /*writable*/);
}

我不同意将其转换为数组。MemoryStream可以只是一个普通的ol流,大多数时候,它的使用者并不关心它的实现。很多时候,您在测试时使用MemoryStream,在生产过程中使用文件流,例如,出于我的目的,我确实希望返回一个流。出于上述同样的原因,马特也提到了这一点。冲洗StreamWriter是我所缺少的。谢谢。我知道这是一个古老的帖子。但它救了我。谢谢:)谢谢你提醒我flushWhy要返回MemoryStream的新实例?这难道不是低效的、冗余的吗?使其成为只读的,停止使用为可写流分配的额外内存,允许在创建流时“使用”正常的流代码模式。在这种特殊情况下,这不是很重要,但若下面的流将被关闭或更改,那个么返回调用方可以以任何方式使用的流通常是很好的,而不必担心。在这种特殊情况下,您可以使用GetBuffer而不是ToArray(生成内部缓冲区的副本)非常高效地创建新流。刷新流对我有帮助!只是一个旁注;我正在使用流写入器向内存流写入1348字节。1024个字节将被写入(无需刷新),我花了很长时间才弄明白,但最终刷新会移动其他324个字节。
using(var memStream = new MemoryStream())
{
   ....
   return new MemoryStream(memStream.ToArray(), false /*writable*/);
}