加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 复制除流的最后16个字节以外的所有字节?早期检测到流末?

发布时间:2020-12-16 01:55:29 所属栏目:百科 来源:网络整理
导读:这与C#有关.我们有一种情况需要将整个源流复制到目标流中,除了最后16个字节. 编辑:流可以达到40GB,所以不能做一些静态byte []分配(例如:.ToArray()) 看看MSDN documentation,似乎只有当返回值为0时我们才能可靠地确定流的结束.返回值介于0和请求的大小之间
这与C#有关.我们有一种情况需要将整个源流复制到目标流中,除了最后16个字节.

编辑:流可以达到40GB,所以不能做一些静态byte []分配(例如:.ToArray())

看看MSDN documentation,似乎只有当返回值为0时我们才能可靠地确定流的结束.返回值介于0和请求的大小之间可能意味着字节“当前不可用”(这究竟意味着什么?)

目前,它按如下方式复制每个字节. inStream和outStream是通用的 – 可以是内存,磁盘或网络流(实际上也是一些).

public static void StreamCopy(Stream inStream,Stream outStream)
{
    var buffer = new byte[8*1024];
    var last16Bytes = new byte[16];
    int bytesRead;
    while ((bytesRead = inStream.Read(buffer,buffer.Length)) > 0)
    {
        outStream.Write(buffer,bytesRead);
    }
    // Issues:
    // 1. We already wrote the last 16 bytes into 
    //    outStream (possibly over the n/w)
    // 2. last16Bytes = ? (inStream may not necessarily support rewinding)
}

什么是可靠的方法来确保复制除了最后16个之外的所有内容?我可以考虑在inStream上使用Position和Length,但是在MSDN上有一个问题

If a class derived from Stream does not support seeking,calls to Length,SetLength,Position,and Seek throw a NotSupportedException. .

解决方法

>从输入流中读取1到n个字节
>将字节附加到 circular buffer.2
>将第一个最大(0,b – 16)字节从循环缓冲区写入输出流,其中b是循环缓冲区中的字节数.
>从循环缓冲区中删除刚刚写入的字节.
>转到第1步.

1这就是Read方法的作用 – 如果你调用int n = Read(buffer,500);它将在1到500个字节之间读入缓冲区并返回读取的字节数.如果Read返回0,则表示您已到达流的末尾.

2为获得最佳性能,您可以直接将输入流中的字节读入循环缓冲区.这有点棘手,因为你必须处理缓冲区底层数组中的环绕声.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读