【问题标题】:How to get the bytes from a stream that I'm not writing to如何从我没有写入的流中获取字节
【发布时间】:2012-06-04 11:34:36
【问题描述】:

我正在编写一个使用第 3 方 .NET 库的 VB.net 应用程序(但如果需要,您可以用 C# 回答,没问题)。特别是,该库中的一种方法将 IO.Stream 作为输入(除其他外)并将其处理结果写入所述流。我的问题是该方法在写入流后关闭流,所以我无法读回它写入的数据!

更具体地说:如果流是 FIeStream ,它当然可以工作,因为它将数据写入磁盘,但如果我想直接将数据读取到内存中怎么办?我尝试使用 MemoryStream,但正如我所说,当方法返回时,流已经关闭,我无法从中读取任何内容:(

编辑:通过执行类似于“usr”建议的操作来解决。这是代码,如果有人需要的话:

    Imports System.IO

Public Class CloseHijackedMemoryStream
    Inherits MemoryStream

    Public Overrides Sub Close()
        'We don't do anything, so the stream is still open
    End Sub

    Public Sub RealClose()
        MyBase.Close()
    End Sub
End Class

【问题讨论】:

  • 为什么需要读回刚刚写入另一个流的字节?无论如何,这些字节将与您从中复制它的流相同,因此您始终可以重置原始流的位置以获取所需的内容。
  • 您应该问“我如何读取您的代码写入流中的任何内容?”致第 3 方组件的作者恕我直言:他们可能已经考虑过并为您提供建议
  • @Brian:正如我所说,没有写入流。第三方应用程序是。并且一旦写入它就会关闭流,所以我不能从它读回,它是“用完的”。我想知道是否有一种方法(或特定类型的流)可以写入,比如说,以前提供的 ByteArray,所以当它关闭时,我有可用的写入数据。

标签: c# .net vb.net stream


【解决方案1】:

您可以围绕将所有调用转发到底层(包装)流但不转发 Close 和 Dispose 调用的流编写包装类。这将阻止图书馆关闭它。

从 Stream 派生,将“内部流”作为 ctor arg 并通过委托给内部流来实现所有方法。

【讨论】:

  • 将此标记为已接受,因为我在等待答案时做了类似的事情:实际上我没有使用包装器,而是继承了 MemoryStream 并用一个空的方法覆盖了 Close() 方法,并添加了一个“RealClose ()" 方法,它实际上关闭了流。将编辑主要帖子以添加代码以防其他人需要它。谢谢!
【解决方案2】:

MemoryStream 有一个返回其全部内容的 ToArray() 方法。我刚刚做了一个快速测试,似乎关闭后仍然有效(即使在处理后)

【讨论】:

  • +1 因为它实际上可以工作 O.o(即使我使用了不同的解决方案,如第 1 篇文章中所述)。由于 Read() 方法引发了异常,所以没想过尝试...
【解决方案3】:

在这种情况下,您可以从 MemoryStream 创建自定义类型“MyMemoryStream”并覆盖 Dispose 和 close 方法。

public class MyMemoryStream : MemoryStream
{
    protected override void Dispose(bool disposing)
    {
    }
}

希望对你有帮助。

【讨论】:

  • 在发布之前已经选择了答案,但无论如何+1,因为这几乎是我在等待答案时所做的,谢谢你的建议!
猜你喜欢
  • 1970-01-01
  • 2014-07-04
  • 2014-06-24
  • 2012-04-02
  • 2021-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-03
相关资源
最近更新 更多