【问题标题】:Exception in Nested StreamWriter and StreamReader嵌套 StreamWriter 和 StreamReader 中的异常
【发布时间】:2018-02-11 12:32:02
【问题描述】:

我有 2 段代码。 看看这个。

static void Main(string[] args)
    {
        using (FileStream fs = new FileStream("temp.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite))
        {
            using (StreamWriter writer = new StreamWriter(fs))
            {
                writer.WriteLine("Hello World");
                using (StreamReader reader = new StreamReader(fs))
                {
                    Console.WriteLine(reader.ReadToEnd());
                } // Line-1
            } //Line-2 -> System.ObjectDisposedException: 'Cannot access a closed  file.'
        }
    }

在第 2 行,我得到 System.ObjectDisposedException 发生。 为什么我会在此处出现此异常?

经过一番思考,我认为异常发生在第 2 行,因为与引用“fs”关联的流已经在第 1 行关闭。在第 2 行,它试图再次关闭同一个流。这个答案是有道理的。因此,我以为我找到了问题的正确答案,但后来我尝试了一些不同的方法。

现在看看这段代码。

static void Main(string[] args)
    {
        using (FileStream fs = new FileStream("temp.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite))
        {
            using (StreamReader reader = new StreamReader(fs))
            {
                Console.WriteLine(reader.ReadToEnd());
                using (StreamWriter writer = new StreamWriter(fs))
                {
                    writer.WriteLine("Hello World");
                } // Line-1
            } // Line-2 -> No Exception occurred.
        }
    }

在这段代码中,我没有遇到任何异常。即使我再次做同样的事情。在这里,与引用“fs”关联的流也已在 Line-1 关闭,并且它也在尝试在 Line-2 关闭流。

那么为什么我在这里没有得到任何异常?

我的问题与此不同 Is there any way to close a StreamWriter without closing its BaseStream? 因为我试图用第二个代码做同样的事情,尽管事实上(在第二个代码中) using 语句已经关闭了基本流( fs) 在第 1 行。我在 Line-2 中仍然没有任何异常。

因为@mjwills 和@evk 表示发生异常是因为在文件关闭后刷新流的内容。

我试过了。

static void Main(string[] args)
    {
        using (FileStream fs = new FileStream("temp.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite))
        {
            using (StreamWriter writer = new StreamWriter(fs))
            {
                writer.WriteLine("Hello World");
                writer.Flush(); // Flushed the contents explicitly.
                using (StreamReader reader = new StreamReader(fs))
                {
                    Console.WriteLine(reader.ReadToEnd());
                } // Line-1
            } // Line-2 -> System.ObjectDisposedException: 'Cannot access a closed  file.' 
        }
    }

结果是一样的,即使我已经明确刷新了内容,我仍然有这个异常。请帮忙。

【问题讨论】:

  • 问题不在多次关闭文件中。您可以在 FileStream 上多次调用 Close\Dispose ,而不会出现任何问题。但是您无法在文件关闭后读取\写入文件,其中包括将内容从缓冲区刷新到磁盘 - 这就是您的第一个示例中发生的情况(而在第二个示例中,第二次关闭时没有什么可写\读)。
  • 我是说我已经尝试在进入 StreamReader 的 using 块之前刷新 writer。
  • @Evk 在进入 StreamReader 的 using 块之前,我明确地调用了刷新。
  • 是的,但不同的是 - StreamWriter 无论如何都会尝试在关闭时刷新。当文件关闭时,这个尝试(即使真的没有什么要刷新的)被拒绝。另一方面,StreamReader 不会尝试刷新任何内容(毕竟是读者)。

标签: c# .net stream using


【解决方案1】:

StreamWriterDispose 方法刷新到磁盘。

StreamReaderDispose 方法不会(为什么会这样?它只是一个阅读器...)。

因此,将作者然后设置为读者(在它有效的意义上)是“某种”安全的,但反之则不然。

考虑在您的StreamWriterStreamReader 上使用leaveOpen 以避免此类问题。通过使用leaveOpen,您可以手动DisposeStream,这意味着您可以100% 确信代码可以正常工作——而不必担心刷新行为等问题。 p>

【讨论】:

  • 感谢您的意见
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-17
  • 2016-08-23
  • 2014-06-13
  • 2012-02-22
  • 1970-01-01
  • 1970-01-01
  • 2014-05-22
相关资源
最近更新 更多