FileStream fsMyfile = new FileStream("myfile.txt", FileMode.Create, FileAccess.ReadWrite);            StreamWriter swMyfile = new StreamWriter(fsMyfile);
            swMyfile.WriteLine("Hello,World");
            swMyfile.WriteLine("asdfasfasfasdfasdfasdfasdf");
            swMyfile.WriteLine("ADFASFASDFASDFASFASFASDFASDF");
            swMyfile.WriteLine("1232432534563456");
            swMyfile.Flush();            //以文本方式读文件
            StreamReader srMyfile = new StreamReader(fsMyfile);
            srMyfile.BaseStream.Seek(0, SeekOrigin.Begin);
            Console.WriteLine("****************以文本方式读文件*******************");
            string s1;
            while ((s1 = srMyfile.ReadLine()) != null)
            {
                Console.WriteLine(s1);
            }
            Console.WriteLine();            //以二进制方式读文件
            BinaryReader brMyfile = new BinaryReader(fsMyfile);
            brMyfile.BaseStream.Seek(0, SeekOrigin.Begin);
            Console.WriteLine("****************以二进制方式读文件*****************");
            Byte b1;
            while (brMyfile.PeekChar() > -1)
            {
                b1 = brMyfile.ReadByte();
                if (b1 != 13 && b1 != 10)
                {
                    Console.Write("{0}", b1.ToString());
                    Console.Write(".");
                }
                else
                {
                    Console.WriteLine();
                }
            }
            Console.WriteLine("\n");            //释放对象空间
            brMyfile.Close();
            srMyfile.Close();
            swMyfile.Close();
            fsMyfile.Close();上面的代码在运行到swMyfile.Close();就会抛出异常“所指向的对象已经释放”,而将swMyfile.Close();提到brMyfile.Close();前面就好了,是不是与前面的swMyfile.Flush();有关,请哪位高手解释一下这四个对象释放的顺序?

解决方案 »

  1.   

    其实你只要fsMyfile.Close();一句就够了,因为都是由fsMyfile创建的流,fsMyfile被释放了,所有被创建的流都一起被释放,你遇到的问题也是这样产生的连带释放问题,只不过那个异常只在“swMyfile.Close();”时发生。
      

  2.   

    当然先创建 File,再创建 Reader那么先关闭 Reader,再关闭 File。建议使用 using 语法:
    using FileStream fsMyfile = new FileStream("myfile.txt", FileMode.Create, FileAccess.ReadWrite)
    {
        ...
    }
      

  3.   

    因为StreamReader关闭时会同时关闭基础流并释放相关资源...而StreamWriter和BinaryReader关闭时只关闭基础流不释放基础流资源...fsMyfile是swMyfile、srMyfile和brMyfile的基础流...这就么简单...