是否可以不关闭 StreamReader/StreamWriter 以保持底层流打开?

2024-03-05

我有一个类,它本质上包装了一个用于读/写的流,但该流预计由该类的使用者管理。为了便于使用,我使用 StreamReader 和 StreamWriter 类对流执行 I/O 操作。通常我会把读者和作者包裹起来using块,但我想避免关闭读取器和写入器,因为这样做也会关闭底层流,我必须保持它打开。

如果我希望底层 Stream 由调用者管理,那么不关闭 StreamReader/StreamWriter 在内存/资源管理方面是否安全?当流在其他地方显式关闭时,读取器和写入器是否会被垃圾收集?

public class Wrapper 
{
    private Stream _underlyingStream;
    public Wrapper(Stream underlyingStream) 
    {
        _underlyingStream = underlyingStream;
    }

    public string GetValue() 
    {
        _underlyingStream.Seek(0, SeekOrigin.Begin);
        var reader = new StreamReader(_underlyingStream);
        return reader.ReadToEnd(); // we're done, but the stream is not ours to close
    }
}

如果没有人关闭流,那么最终将调用终结器,它应该调用 dispose 并在 GC 时关闭它们。但这在资源方面是相当糟糕的,因为它会将所有可能昂贵的资源分配到 GC 之前。对象的寿命越长,情况可能会变得更糟,特别是如果它在集合中幸存下来并升级到第 1 代甚至第 2 代。

如果您可以向呼叫者提供一些可以隔离此问题的内容,那就太好了。也许您可以缓存流中的某些内容,以便可以关闭它,同时仍然向调用者提供内容?

EDIT编辑后:现在我看到你的呼叫者通过了一个要操作的流,我的答案必须不同!很明显,您的调用者应该管理流的生命周期。我一开始的印象是您的班级创建了一个流并希望调用者管理它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否可以不关闭 StreamReader/StreamWriter 以保持底层流打开? 的相关文章

随机推荐

  • 与有向边的最大加权二分匹配

    我知道计算最大加权匹配的各种算法加权 无向二分图 即分配问题 例如 匈牙利算法 贝尔曼 福特算法甚至 Blossom 算法 适用于一般图 即非二分图 但是 如果二分图的边是 如何计算最大加权匹配加权和定向 我希望能够提供具有多项式复杂度的算
  • java中的equals方法

    我读过有关equals java中的方法 我听说它只是根据价值进行比较 但是为什么在下面的情况下它返回 false 其中值相同但类型不同 public class test public static void main String ar
  • Coq :> 符号

    这可能是非常微不足道的 但我找不到任何关于 gt 符号在 Coq 中含义的信息 有什么区别 U 类型 和 W gt 类型 这取决于符号出现的位置 例如 如果它位于记录声明内 它会指示 Coq 添加相应的记录投影作为强制 具体来说 假设我们有
  • 如何在打字稿中使用不同类型的通用键输入对象

    您将如何在打字稿中输入这些对象 我有一个特殊的 日期时间 键 即日期 其余键是数字 但我事先并不知道每个对象上将设置哪些键 示例值 type Metrics const example1 Metrics datetime new Date
  • Facebook FB.login 在 Safari 中有效,但在移动 Safari 中无效

    以下 FB Login 函数在桌面 Chrome FF 和 Safari 中运行良好 但在移动 Safari 中 在 iPhone 4S 上测试 它挂起并且不会返回 FB login 回调 当我使用 Safari 并将用户代理设置为 Saf
  • 检查是否有节点但没有文本

    我有以下 xml 片段 Case1
  • CSS菜单IE7问题

    菜单适用于所有主要浏览器 但在 IE7 中看起来有所不同 请参阅下面的屏幕截图 查看演示 http jsfiddle net FQLdm 6 http jsfiddle net FQLdm 6 当您将鼠标悬停在主页链接上时 您将看到一个子菜
  • 如何在 intelliJ-idea 中最好地调试 solr?

    如何在 intelliJ idea 中最好地调试 solr 哪条路容易 当向 solr 发布查询时 我想处理这个问题 您可以设置远程调试 在里面运行 调试配置 然后当使用默认的jetty 这个处于多核模式 启动solr时 传入 java a
  • 按第一个字母对字符串数组进行分组

    我面临这个挑战 其中包括 编写一个以字符串数组作为参数的函数 然后 按第一个字母对数组中的字符串进行分组 返回一个对象 其中包含带有代表第一个字母的键的属性 例如 应该返回 groupIt hola adios chao hemos acc
  • Android - EBADF(错误文件号)OnClickInfoMarker

    我搜索过相关问题但没有找到 我创建了一个显示图片 名称和地址的 InfoWindowMarker 然后我创建 OnInfoWindowClickListener 将显示所选标记的纬度和经度 但是当我单击信息窗口时 我收到此错误消息 Logc
  • Kotlin 中对象字段中具有上下文的 Android 类

    Kotlin 中的对象类中是否可以有一个具有上下文的属性 在 Android 中 将上下文相关对象放入静态字段中是一种不好的做法 Android studio 甚至会突出显示它并发出警告 这与 Kotlin 不同 Kotlin 没有警告 示
  • Pandas 数据框从指定列中选择具有最高值的整行

    我有一个数据框 我想返回包含指定列中最大值的完整行 假设我创建了一个像这样的数据框 df pd DataFrame np random randint 0 100 size 25 4 columns list ABCD 然后我会有一个像这样
  • Android 测试框架

    我是 Android 测试框架的新手 想了解现有测试框架之间的区别 Monkey CTS Instrumentation Framework 和 Robotium 仪器仪表是测试的一个类别 与单元测试相反 该框架提供了用于仪器测试的挂钩 但
  • 将散列捆绑 URL 插入静态 pug 模板

    我正在使用 Webpack pug html loader file loader 生成一堆静态 pug 模板 我还想开始添加散列捆绑文件名 但我无法弄清楚如何将散列文件名插入到我的所有哈巴狗模板中 这就是我当前在所有哈巴狗模板中引用我的包
  • 为什么是 SIGSEGV?

    为什么这段代码会抛出一个SIGSEGV http en wikipedia org wiki SIGSEGV int main unsigned long toshuffle 9765625 unsigned long i for i 0
  • 螺纹消毒剂可以用吗?

    我想尝试一下线程消毒剂 http code google com p data race test wiki ThreadSanitizer Using ThreadSanitizer http code google com p data
  • 无法使用 jinja2 将浮点数舍入为整数

    尝试让 jina2 模板执行舍入时遇到问题 我真的不介意发生什么 因为我的所有数字都是通过乘以小于 1 的小数得出的 例如0 31 然后乘以100 所以我有31 0 我想去掉小数位 但似乎没有任何作用 row score combined
  • 单击通知时如何打开“活动”

    我需要使用带有点击事件的通知 我有通知方法 但此方法不会打开我的活动 My code private void sendNotification String msg NotificationCompat Builder mBuilder
  • 批:管子是什么|用于?

    stackoverflow 用户大家好 我对批处理并不陌生 我只是从来没用过管道 批量 甚至在我阅读 ss64 com 上的参考资料后 我也不明白管道的用途 起初我以为它是 OR 运算符或其他东西 显然我现在知道它不是 我只知道它位于两行
  • 是否可以不关闭 StreamReader/StreamWriter 以保持底层流打开?

    我有一个类 它本质上包装了一个用于读 写的流 但该流预计由该类的使用者管理 为了便于使用 我使用 StreamReader 和 StreamWriter 类对流执行 I O 操作 通常我会把读者和作者包裹起来using块 但我想避免关闭读取