猿问

有什么方法可以关闭StreamWriter而不关闭其BaseStream吗?

我的根本问题是,在using调用Dispose时StreamWriter,它还会处理BaseStream(与相同的问题Close)。


我对此有一个解决方法,但是如您所见,它涉及复制流。有什么方法可以执行此操作而不复制流?


这样做的目的是将字符串的内容(最初从数据库中读取)放入流中,以便可以由第三方组件读取该流。

注意:我无法更改第三方组件。


public System.IO.Stream CreateStream(string value)

{

    var baseStream = new System.IO.MemoryStream();

    var baseCopy = new System.IO.MemoryStream();

    using (var writer = new System.IO.StreamWriter(baseStream, System.Text.Encoding.UTF8))

    {

        writer.Write(value);

        writer.Flush();

        baseStream.WriteTo(baseCopy); 

    }

    baseCopy.Seek(0, System.IO.SeekOrigin.Begin);

    return baseCopy;

}

用作


public void Noddy()

{

    System.IO.Stream myStream = CreateStream("The contents of this string are unimportant");

    My3rdPartyComponent.ReadFromStream(myStream);

}

理想情况下,我正在寻找一种虚构的方法BreakAssociationWithBaseStream,例如


public System.IO.Stream CreateStream_Alternate(string value)

{

    var baseStream = new System.IO.MemoryStream();

    using (var writer = new System.IO.StreamWriter(baseStream, System.Text.Encoding.UTF8))

    {

        writer.Write(value);

        writer.Flush();

        writer.BreakAssociationWithBaseStream();

    }

    return baseStream;

}


HUX布斯
浏览 582回答 3
3回答

子衿沉夜

如果使用的是.NET Framework 4.5或更高版本,则存在StreamWriter重载,使用该重载可以要求在关闭writer时要求基本流保持打开状态。在4.5之前的.NET Framework的早期版本中,StreamWriter 假定它拥有流。选项:不要处理StreamWriter; 冲洗一下即可。创建一个流包装器,该包装器将忽略对Close/的调用,Dispose但将代理所有其他内容。如果您想从那里获取它,我可以在MiscUtil中实现。

ITMISS

内存流具有ToArray属性,即使关闭流也可以使用它。To Array将流内容写入字节数组,而不管Position属性如何。您可以根据您写入的流创建一个新的流。public System.IO.Stream CreateStream(string value){    var baseStream = new System.IO.MemoryStream();    var baseCopy = new System.IO.MemoryStream();    using (var writer = new System.IO.StreamWriter(baseStream, System.Text.Encoding.UTF8))    {        writer.Write(value);        writer.Flush();        baseStream.WriteTo(baseCopy);     }    var returnStream = new System.IO.MemoryStream( baseCopy.ToArray());    return returnStream;}
随时随地看视频慕课网APP
我要回答