c# – 复制除流的最后16个字节以外的所有字节?早期检测到流末?
这与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上有一个问题
解决方法
>从输入流中读取1到n个字节
>将字节附加到 circular buffer.2 >将第一个最大(0,b – 16)字节从循环缓冲区写入输出流,其中b是循环缓冲区中的字节数. >从循环缓冲区中删除刚刚写入的字节. >转到第1步. 1这就是Read方法的作用 – 如果你调用int n = Read(buffer,500);它将在1到500个字节之间读入缓冲区并返回读取的字节数.如果Read返回0,则表示您已到达流的末尾. 2为获得最佳性能,您可以直接将输入流中的字节读入循环缓冲区.这有点棘手,因为你必须处理缓冲区底层数组中的环绕声. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |