【问题标题】:C# write memorystream to file [duplicate]C#将内存流写入文件[重复]
【发布时间】:2021-01-26 16:15:19
【问题描述】:

我有一个简单的函数,它应该接收 Stream 对象并将其写入文件“result.txt” 这是我的功能:

public void WriteToFile(Stream stream)
        {
            StreamReader reader = new StreamReader(stream);
            stream.Position = 0;
            FileInfo f = new FileInfo("result.txt");
            FileStream fs = f.Create();
            stream.CopyTo(fs);
            stream.Position = 0;
            var text = reader.ReadToEnd();
            Console.WriteLine(text);
        }

但是我在写入文件时遇到了问题。结果 - 文件为空。但是,我从这行代码在控制台中收到输出:

var text = reader.ReadToEnd();
Console.WriteLine(text);

在控制台我得到简单而简短的 json 输出

{"startAt":0,"maxResults":0,"total":472,"issues":[]}

这个函数适用于其他更大的流,但是这个 52 字节的流只是不想被写入文件。我做错了什么?

【问题讨论】:

  • 你永远不会释放FileStream,所以它的内部缓冲区永远不会被刷新。使用using 块来处理FileStream
  • (另外,写FileStream fs = File.Create("result.txt") 比通过FileInfo 更容易)
  • 先创建StreamReader 然后继续操作你给它的stream 对象也有点怀疑(就改变它的位置而言)。可能没问题,只要您直到最后才尝试使用阅读器(如此处),但如果是这样,为什么不延迟创建 reader
  • @canton7 很好的答案,伙计!出于某种原因,需要处理小流以从缓冲区写入磁盘,但大流则不需要。为什么呢?我在哪里可以了解更多信息?
  • 亲爱的,您应该始终在工作结束时处置您使用的任何类型的资源,以防止垃圾收集或内存泄漏开销。处理机制可以通过显式的 Dispose() 方法或 Using 块来完成。

标签: c# memorystream


【解决方案1】:

您不需要任何 StreamReader,只需这样做:

public void WriteToFile(Stream stream)
{
        stream.Seek(0, SeekOrigin.Begin);
       
        using(var fs = new FileStream("/path/to/file", FileMode.OpenOrCreate))
        {
             stream.CopyTo(fs);
        }
}

//var memoryStream...
//...

WriteFoFile(memoryStream);

【讨论】:

  • 谢谢。但我想最好的答案是由canton7给出的。你告诉我使用“使用”块来处理 FileStream。出于某种原因,大流将自己从缓冲区写入磁盘,但小流需要先处理掉。为什么呢?我在哪里可以了解更多信息?
【解决方案2】:

你可以这样使用:

public void WriteToFile(Stream stream)
{
    var writer = new System.IO.StreamWriter("result.txt");
    StreamReader reader = new StreamReader(stream);
    while ((line = reader.ReadLine()) != null)
    {
        writer.WriteLine(line);          
    }
 
    var text = reader.ReadToEnd();

    writer.Close();
    reader.Close();

    Console.WriteLine(text);

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-28
    • 2010-11-22
    • 2013-12-02
    • 2018-08-13
    相关资源
    最近更新 更多