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