【发布时间】: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