需要帮助了解Stream.Read()

Jie*_*eng 2 c# io filestream

我对逐渐将文件读入缓冲区的步骤感到困惑.

来自MSDN文档

public abstract int Read(
    byte[] buffer,
    int offset,
    int count
)
Run Code Online (Sandbox Code Playgroud)

源自C#的例子

FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read);
try
{
    int length = (int)fileStream.Length;  // get file length
    buffer = new byte[length];            // create buffer
    int count;                            // actual number of bytes read
    int sum = 0;                          // total number of bytes read

    // read until Read method returns 0 (end of the stream has been reached)
    while ((count = fileStream.Read(buffer, sum, length - sum)) > 0)
        sum += count;  // sum is a buffer offset for next reading
Run Code Online (Sandbox Code Playgroud)

我可以说该行fileStream.Read(buffer, sum, length - sum)读作" (偏移)读取到(要读取的总字节数)fileStreamsumlength - sumbuffer ".好的,所以在开始时,当sum= 0时,我将有效地将整个fileStream读入缓冲区1短,但我认为情况并非如此.也许可以Read()将任何可能的内容读入缓冲区?然后返回,以便你可以Read()再次?我有点困惑.

Jon*_*eet 13

Read将读取任何可用的内容(阻塞直到某些内容可用)但是可能没有足够的数据准备填充缓冲区以开始.

想象一下,通过网络下载数据 - 可能有数兆字节的数据要下载,但只有部分数据可供下载.所以你需要继续打电话,Read()直到你读到你想要的东西.

Stream.Read最多读取您要求的字节数,但可以轻松读取.诚然本地文件流,我怀疑它总是读就像你自找的,除非该文件是短,但是这不是流的真正在一般情况下,我不相信这是保证即使是本地文件流.

  • @knocte:在我看来,这只是糟糕的文档。`StreamReader.ReadBlock`(我假设您指的是这个)将阻塞,直到读取*所有*请求的数据,或者到达流的末尾。`Read` 将阻塞,直到读取*一些*数据 - 它仍然阻塞。 (2认同)