能否克隆 .NET 流?

18

我们能克隆一个流吗?

4个回答

15
不行,流通常指某种本地资源(如套接字、文件句柄等),因此它们无法被克隆或序列化。此外,许多流是单向的,并且不支持寻址,因此您可能无法重新从流中读取。
但是,您可以从可读流中复制到MemoryStream中,将其作为字节数组进行移动。
请参见以下帖子,其中提供了代码片段以显示如何执行此操作: How do I copy the contents of one stream to another?
public static void CopyStream(Stream input, Stream output)
{
    byte[] buffer = new byte[32768];
    while (true)
    {
        int read = input.Read (buffer, 0, buffer.Length);
        if (read <= 0)
            return;
        output.Write (buffer, 0, read);
    }
}

14
.NET 4之后,Stream类有一个CopyTo方法。 - Alex
1
很高兴知道已经添加了,谢谢!当时还没有。 - Josh

3
不,克隆操作并不是Stream类的通用支持操作。要实现这一点,它必须涵盖Stream类的所有可能实现。
对于像FileStream这样的项目,这可能是可行的,但考虑一下对于像NetworkStream这样的项目会意味着什么。克隆通常具有创建完全独立的对象的概念,在创建时这些对象是相同的。然而,对于TCP连接这样的项目来说,这通常是不可行的,因为它们通常被包装在某个级别的NetworkStream中。

这是真的,但有些流实现不支持抛出NotSupportedException的某些功能...如果涉及克隆,同样可以这样做。 - rafek

1
不能克隆一个泛型流。

0

不确定您是在流被消耗之前还是之后想要克隆它。如果您需要为其他目的复制流,则这可能会有所帮助。我需要访问已关闭的流的内容,这使我能够将原始流内容复制到另一个流中。 访问已关闭的流


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接