Нужна помощь в понимании Stream.Read () - PullRequest
2 голосов
/ 19 октября 2010

Я немного сбит с толку относительно шагов по чтению файла в буфер постепенно.

из документов MSDN

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

источник из 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

Можно ли сказать, что строка fileStream.Read(buffer, sum, length - sum) читается как " Чтение fileStream от sum (смещение) до length - sum (общее количество байтов для чтения) в buffer». Хорошо, поэтому в начале, когда sum = 0, я эффективно прочитаю весь fileStream в буфер за 1 короткое время, но я думаю, что это не так. Может быть Read() читает все, что может, в буфер? затем возвращается, чтобы вы могли Read() это снова? я немного смущен.

Ответы [ 3 ]

13 голосов
/ 19 октября 2010

Read будет читать все, что доступно (блокируется до что-то доступно), но может не хватить данных, готовых для заполнения буфера для начала.

Представьте, что вы загружаете данные по сети - для загрузки могут быть мегабайты данных, но для начала доступны только некоторые из них. Поэтому вам нужно продолжать звонить Read(), пока вы не прочитаете столько, сколько хотите.

Stream.Read будет читать самое большее количество байтов, которое вы запросили, но можете легко прочитать меньше. По общему признанию для локальных файловых потоков, я подозреваю, что он всегда читает столько, сколько вы просили, если файл не короче, но это не относится к потокам в целом, и я не верю, что это гарантировано даже для локального файловые потоки.

2 голосов
/ 19 октября 2010

Метод Read считывает по крайней мере один байт и самое большее указанное число байтов.

Метод обычно возвращает все данные, которые доступны в данный момент. Если поток, например, идет через Интернет, он обычно возвращает то, что получил, и для файлового потока он обычно возвращает весь файл.

Однако, реализация должна решить, какое поведение лучше. Например, он может сначала вернуть то, что он может получить из файлового кэша, который может быть возвращен немедленно, и позволить вам сделать еще один вызов для получения данных, которые требуют фактического чтения с диска.

При использовании метода Read вы всегда должны использовать цикл, чтобы вы наверняка получили все данные. Это может показаться необязательным, если первый вызов всегда возвращает все данные, но могут быть ситуации, когда это не так.

0 голосов
/ 19 октября 2010

Из 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.
...