你可以让StreamReader处理底层的stream吗?
有没有办法做到这一点:
this.logFile = File.Open("what_r_u_doing.log", FileMode.OpenOrCreate, FileAccess.ReadWrite); using(var sr = new StreamReader(this.logFile)) { // Read the data in } // ... later on in the class ... this.logFile = File.Open("what_r_u_doing.log", FileMode.OpenOrCreate, FileAccess.ReadWrite); using(var sw = new StreamWriter(this.logFile)) { // Write additional data out... }
而不必打开文件两次?
我似乎无法使StreamReader不处理我的stream。 我也不想让它超出范围。 然后垃圾收集器将最终调用Dispose,杀死stream。
我也不想让它超出范围。 然后垃圾收集器将最终调用Dispose,杀死stream。
垃圾收集器将调用Finalize
方法(析构函数),而不是Dispose
方法。 终结器将调用Dispose(false)
,这将不会处理基础stream。 如果您需要直接使用底层的stream,您应该可以保持StreamReader
超出范围。 只要确保在适当的时候手动处理底层stream。
.NET 4.5将最终解决这个问题与一个新的构造函数StreamReader和StreamWriter需要一个leaveOpen参数:
StreamReader(Stream stream, Encoding encoding, bool detectEncodingFromByteOrderMarks, int bufferSize, bool leaveOpen) StreamWriter(Stream stream, System.Text.Encoding encoding, int bufferSize, bool leaveOpen)
你可以使用Jon Skeet的MiscUtil库中的NonClosingStreamWrapper
类,它完全适合这个目的
您可以创build一个从StreamReaderinheritance的新类并重写Close方法; 在你的Close方法中,调用Dispose(false),就像Mehrdad指出的那样,不closuresstream。 当然,这同样适用于StreamWriter。
然而,似乎更好的解决scheme只要保持在StreamReader和StreamWriter实例,只要你可能需要它们。 如果您已经打算保持stream打开,那么也可以保持StreamReader和StreamWriter处于打开状态。 如果正确使用StreamWriter.Flush和Stream.Seek,则即使在读取和写入时也应该能够正常工作。
只要删除使用块。 如果您不想Dispose()stream,我不需要Dispose()StreamReader。
使用另一个构造函数重载,您可以在其中指定“leaveOpen”参数为“true”
当你完成它时,在try
/ finally
子句中自己closures它。
var sr = new StreamReader(); try { //...code that uses sr //....etc } finally { sr.Close(); }