2011-05-06 37 views
2

我有以下代码来读取和写入单行到文本文件。我们可以在处理结束时为读者和写者对象赋予null吗?或者我应该调用Close()方法?谢谢。关闭FileStream并将其设置为空有什么区别?

FileInfo JFile = new FileInfo(@"C:\test.txt"); 
      using (FileStream JStream = JFile.Open(FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None)) 
      { 
       StreamReader reader = null; 
       StreamWriter writer = null; 
       try 
       { 
        int n; 
        reader = new StreamReader(JStream); 
        string line = reader.ReadLine(); 
        int.TryParse(line, out n); 

        n = n + 1; 

        writer = new StreamWriter(JStream); 
        JStream.Seek(0, SeekOrigin.Begin); 
        writer.WriteLine(n); 
        writer.Flush(); 
       } 
       catch (Exception x) 
       { 
        string message = string.Format("Error while processing the file. {0}", x.Message); 
        System.Windows.Forms.MessageBox.Show(message); 
       } 

       reader = null; 
       writer = null; 
      } 
+0

感谢每一个人的伟大的解释。我使用相同的FileStream对象来创建StreamReader和StreamWriter。如果我在reader和writer对象上调用Close()方法,当它到达writer.Close()时,我会收到一条错误消息“无法访问已关闭的文件”。我猜,因为reader.Close()已经关闭了阅读器流和底层文件流。我无法为读写器创建不同的流,因为我必须锁定文件,直到完成写入文件。 – Jyina 2011-05-06 18:15:44

+0

任何想法在这种情况下做什么?谢谢。 – Jyina 2011-05-06 18:18:54

回答

1

无论是StreamReaderStreamWriter实施IDisposable,这是他们说

的方式“当你与我做的,请调用此方法(Dispose()),所以我知道你跟我做,我可以清理自己“。

(这也被称为确定性终结

所以你需要调用这些Dispose,或在using声明,只是做同样的事情,你包起来。在这两个类别的情况下,如果Dispose尚未关闭,它们将在内部呼叫Close

4

关闭文件时需要执行某些操作。例如,当你的程序访问一个文件,并在其上创建一个handle。流允许框架立即释放句柄和其他类似的资源。

当你将它设置为null,你是依靠垃圾收集器为你做这个重要的功能。 GC可能会将其全部清理干净,否则可能不会。你不知道什么时候会发生。如果你的程序崩溃了,它可能永远不会释放句柄。

它总是一个好主意,.Close()一旦大功告成流自己。

+0

对发生了什么事的很好的解释。 – light 2011-05-06 17:56:56

1

你真的想调用Close()或更好的Dispose(),以确保所有的内容都被刷新。如果您没有明确关闭/处置Writer,则可能会导致无法写入缓冲区。

2

当您设置的对象为null,你告诉你不再需要它的CLR,并定于垃圾收集。您将遇到的问题是CLR挂钩到您打开的文件中,直到程序结束并关闭CLR时才会释放它。当你调用Close()方法时,文件资源被清理,然后所有的碎片和碎片都被正确地安排在垃圾收集中。

如果你在一个使用块中打开streamreader,它也会照顾你,但是你会丢失一些try/catch/finally块得到的细粒度错误处理。

1

我认为最好的解决办法是使用using statment(就像你在FileStream所做的那样)。 它会照顾所有的清洁工作。

相关问题