为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
HUX布斯 2019-11-02 10:56:08
我的根本问题是,在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;}
查看完整描述

3 回答

?
子衿沉夜

TA贡献1828条经验 获得超3个赞

如果使用的是.NET Framework 4.5或更高版本,则存在StreamWriter重载,使用该重载可以要求在关闭writer时要求基本流保持打开状态。

在4.5之前的.NET Framework的早期版本中,StreamWriter 假定它拥有流。选项:

  • 不要处理StreamWriter; 冲洗一下即可。

  • 创建一个流包装器,该包装器将忽略对Close/的调用,Dispose但将代理所有其他内容。如果您想从那里获取它,我可以在MiscUtil中实现。


查看完整回答
反对 回复 2019-11-02
?
ITMISS

TA贡献1871条经验 获得超8个赞

内存流具有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;

}


查看完整回答
反对 回复 2019-11-02
  • 3 回答
  • 0 关注
  • 581 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信