代码之家  ›  专栏  ›  技术社区  ›  John Gietzen

是否可以阻止StreamReader释放底层流?

  •  44
  • John Gietzen  · 技术社区  · 15 年前

    有没有办法做到这一点:

    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...
    }
    

    不用打开文件两次?

    我不能让流阅读器不处理我的流。我也不想让它超出范围。然后垃圾收集器最终将调用Dispose,从而杀死流。

    8 回复  |  直到 7 年前
        1
  •  44
  •   Mehrdad Afshari    15 年前

    我也不想让它超出范围。然后垃圾收集器最终将调用Dispose,从而杀死流。

    垃圾收集器将调用 Finalize 方法(析构函数),而不是 Dispose 方法。终结器将调用 Dispose(false) 哪个会 释放基础流。你应该离开 StreamReader 如果您需要直接使用底层流,请超出范围。只要确保在适当的时候手动处置底层流。

        2
  •  64
  •   Simon Buchan    13 年前

    .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)
    
        3
  •  15
  •   Thomas Levesque    15 年前

    你可以用 NonClosingStreamWrapper 乔恩·斯基特的课 MiscUtil library 就为了这个目的

        4
  •  3
  •   Aaron    15 年前

    您可以创建一个继承自StreamReader的新类并重写Close方法;在Close方法中,调用Dispose(false),正如Mehrdad指出的那样,它不会关闭流。当然,这同样适用于StreamWriter。

    然而,一个更好的解决方案似乎只是在您可能需要的时候保留StreamReader和StreamWriter实例。如果您已经计划保持流打开,那么您也可以保持流读卡器和流编写器打开。如果正确使用streamwriter.flush和stream.seek,则即使在进行读写操作时,也应该能够使其正常工作。

        5
  •  2
  •   eflorico    15 年前

    只需移除使用块。我认为,如果不想对流执行Dispose(),就不必释放()streamReader。

        6
  •  2
  •   HANiS    11 年前

    使用另一个构造函数重载,可以在其中将“leaveopen”参数指定为“true”

        7
  •  0
  •   Mike Atlas    15 年前

    把它自己关起来 try / finally 条款当你完成它。

    var sr = new StreamReader();
    try {
        //...code that uses sr
        //....etc
    }
    finally
    {
        sr.Close();
    }
    
        8
  •  0
  •   Nick N.    7 年前

    我总是用这样的东西: (它还使用 leaveOpen 论证)

    public static class StreamreaderExtensions
    {
        public static StreamReader WrapInNonClosingStreamReader(this Stream file) => new StreamReader(file, Encoding.UTF8, true, 1024, true);
    }
    

    用法:

    using (var reader = file.WrapInNonClosingStreamReader())
    {
         ....
    }