当以字节为单位读取大量数据时,While循环会在最后几个字节被触发

本文关键字:字节 最后 几个 循环 读取 为单位 数据 While | 更新日期: 2023-09-27 18:07:29

我正在发送8254789字节的字节。它正在进行循环,但是当它到达at 8246597时,必须读取8192字节。它从while循环中出去了。谁能解释一下,出了什么问题?

 public static byte[] ReadFully(Stream stream, int initialLength)
{
    // If we've been passed an unhelpful initial length, justS
    // use 32K.
    if (initialLength < 1)
    {
        initialLength = 32768;
    }
    byte[] buffer = new byte[3824726];
    int read = 0;
    int chunk;
    try
    {
        while ((chunk = stream.Read(buffer, read, 3824726 - read)) > 0)
        {
            Console.WriteLine("Length of chunk" + chunk);
            read += chunk;
            Console.WriteLine("Length of read" + read);
            if (read == 0)
            {
                stream.Close();
                return buffer;
            }
            // If we've reached the end of our buffer, check to see if there's
            // any more information
            if (read == buffer.Length)
            {
                Console.WriteLine("Length of Buffer" + buffer.Length);
                int nextByte = stream.ReadByte();
                // End of stream? If so, we're done
                if (nextByte == -1)
                {
                    return buffer;
                }
                // Nope. Resize the buffer, put in the byte we've just
                // read, and continue
                byte[] newBuffer = new byte[buffer.Length * 2];
                Console.WriteLine("Length of newBuffer" + newBuffer.Length);
                Array.Copy(buffer, newBuffer, buffer.Length);
                newBuffer[read] = (byte)nextByte;
                buffer = newBuffer;
                read++;                        
            }
        }
        // Buffer is now too big. Shrink it.
        byte[] ret = new byte[read];
        Array.Copy(buffer, ret, read);
        return ret;
    }
    catch (Exception ex)
    { throw ex; }
}      

当以字节为单位读取大量数据时,While循环会在最后几个字节被触发

通常你不会这样写你的流循环。不如试试这样做:

byte[] buffer = new byte[BUFFER_SIZE];
int read = -1;
while((read = stream.Read(buffer, 0, buffer.Length)) > 0)
{
    // ... use read bytes in buffer here
}

你试图每次调整你的偏移量,但你不需要这样做,因为使用游标-所以你基本上跳过了。