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收尾,以免数据丢失。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,394评论 11 349
  • java 接口的意义-百度 规范、扩展、回调 抽象类的意义-乐视 为其子类提供一个公共的类型封装子类中得重复内容定...
    交流电1582阅读 2,311评论 0 11
  • 1.什么是垃圾回收? 垃圾回收(Garbage Collection)是Java虚拟机(JVM)垃圾回收器提供...
    简欲明心阅读 89,965评论 17 311
  • 搭上一辆没有终点的列车 走向迷雾茫茫的远方 他乡 它穿过幽深的隧道 它踏过七月的芬芳 它留恋深沉的夕阳 月亮在头顶...
    清茶配西瓜阅读 167评论 3 2
  • 听风轻敲窗玻璃 在初冬的薄凉里 天快要亮了 碾过岁月的年轮 终是老了容颜 昔日的青丝年少 在不留意时走丢 喜欢被爱...
    田萍阅读 173评论 0 10