System.IO.StreamWriter没有Finalizer

  • System.IO.FileStream可以将字节写入文件,该类有内存缓存
  • System.IO.StreamWriter可以写字符或字符串,也有内存缓存

使用如下方式来写入一个字符串:

FileStream fileStream = new FileStream("DataFile.dat", FileMode.Create);
StreamWriter streamWriter = new StreamWriter(fileStream);
streamWriter.Write("Hello!");
streamWriter.Dispose();

上例中,streamWriter和fileStream都有各自的内存缓冲区,streamWriter的缓冲区满后会数据写入它引用的fileStream对象,而后者的缓冲区满后,会将内容写入文件。

streamWriter的Dispose()会flush缓冲区中的数据,之后Dispose所引用的fileStream,所以并不需要再对fileStream对象Dispose。
StreamWriter有一个leaveOpen参数可以控制

若不进行手动的Dispose,而交由GC来完成,理论上可能出现Exception。这是因为fileStream和streamWriter的Finalize的调用顺序是不确定的(GC特性),如果前者先于后者完成Finalize,则后者进行Finalize时文件已被关闭,造成异常。

为了避免上述异常情况,StreamWrtier并没有重写Finalize,但这样的后果是streamWriter中缓存的数据可能丢失。不重写实现了IDispose接口的StreamWriter的Finalize是可行的,因为其使用的文件资源由引用的FileStream对象管理,而后者重写了Finalize,同样保证了对非托管资源的控制。

所以使用StreamWriter进行文件写入时,要记住调用Dispose收尾,以免数据丢失。

你可能感兴趣的:(System.IO.StreamWriter没有Finalizer)