需要帮助了解Stream.Read()

时间:2010-10-19 08:13:00

标签: c# io filestream

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

来自MSDN文档

public abstract int Read(
    byte[] buffer,
    int offset,
    int count
)

来自C# Examples

的来源
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

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

3 个答案:

答案 0 :(得分:12)

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

想象一下,通过网络下载数据 - 可能有数兆字节的数据需要下载,但只有部分数据可供下载。因此,您需要继续致电Read(),直到您阅读了所需内容为止。

Stream.Read最多会读取 您要求的字节数,但可以轻松读取。无可否认,对于本地文件流,我怀疑它总是读取你要求的内容,除非文件更短,但对于一般的流不是这样,我不相信它是保证即使对于本地文件流。

答案 1 :(得分:1)

Read方法将读取至少一个字节,最多读取指定的字节数。

该方法通常会返回当前可用的所有数据。如果流例如通过互联网传播,它通常会返回它收到的内容,而对于文件流,它通常会返回整个文件。

但是,由实施决定最佳行为是什么。例如,它可能首先返回它可以从文件缓存中获取的内容,可以立即返回,并允许您再次调用以获取需要实际磁盘读取的数据。

使用Read方法时,应始终使用循环,以确保获取所有数据。如果第一个调用似乎总是返回所有数据,则可能看起来不是必需的,但可能存在不会返回所有数据的情况。

答案 2 :(得分:0)

来自MSDN:

When overridden in a derived class, reads a sequence of bytes from the current stream and advances the position within the stream by the number of bytes read.

Return Value

Type: System.Int32
The total number of bytes read into the buffer. This can be less than the number of bytes requested if that many bytes are not currently available, or zero (0) if the end of the stream has been reached.