使用 FileStream 写入文件而不使用“using”
本文关键字:using FileStream 文件 使用 | 更新日期: 2023-09-27 18:32:35
我有一个类成员变量_stream
它是一个FileStream
。这个变量在构造函数中初始化,需要坚持到我完成类。我还有另一个类,每次需要将某些内容写入文件时都会引发一个事件。在我的主类中,我有一个执行实际写入的事件处理程序。我尝试了以下代码,如此问题所示:
void MyEventHandler(string message)
{
using (_stream)
using (StreamWriter s = new StreamWriter(_stream))
s.WriteLine(message);
}
但这不起作用,因为using
在我完成之前处理掉了我的FileStream
。我应该怎么做?
省略using
.
请注意,在这种情况下,定义此方法的类应实现IDisposable
并且应在其Dispose
方法中释放流。 此类的用户应在 using
块中声明它。
首先,您显然需要删除using (_stream)
,因为这将直接处理流。
其次,StreamWriter
还将使用您当前的代码处理流。这方面的选项包括:
-
对于
StreamWriter
也没有using
语句,但如果需要立即将其写入文件,请显式刷新编写器:void MyEventHandler(string message) { var s = new StreamWriter(_stream); s.WriteLine(message); s.Flush(); }
-
使用
StreamWriter
的构造函数,它允许您控制在释放StreamWriter
时是否关闭流:void MyEventHandler(string message) { using (var s = new StreamWriter(_stream, Encoding.UTF8, 1024, true)) { s.WriteLine(message); } }
-
更改您的代码,以便类中的字段是要开始的
TextWriter
而不是Stream
(初始化为您想要的任何文件/流的StreamWriter
) - 然后您根本不需要在方法中创建新StreamWriter
。
正如 Servy 所指出的,你自己的类应该实现IDisposable
并在其Dispose
方法中释放流/编写器。
using
用于函数中的局部变量以隐式释放对象,但是当它是类的成员时,您应该在释放类时释放它。
class YourClass : IDisposable
{
....
public void Dispose()
{
Dispose(true);
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
_stream.Dispose();
}
}
}