У меня нет большого опыта работы с потоками и буферами, но мне нужно сделать это для проекта, и я застрял на исключении, которое генерируется, когда поток, который я читаю, кратен размеру буфера. Я выбрал. Позволь мне показать тебе:
Мой код начинается с чтения bufferSize
(скажем, 100) байтов из потока:
numberOfBytesRead = DataReader.GetBytes(0, index, output, 0, bufferSize);
Затем я выполняю цикл while
:
while (numberOfBytesRead == bufferSize)
{
BufferWriter.Write(output);
BufferWriter.Flush();
index += bufferSize;
numberOfBytesRead = DataReader.GetBytes(0, index, output, 0, bufferSize);
}
... и как только мы доходим до чтения без буфера, мы знаем, что достигли конца потока и можем двигаться дальше.
Но если bufferSize равен 100, а поток равен 200, мы будем читать позиции 0-99, 100-199, а затем пытаться считать ошибки 200-299. Я бы хотел, чтобы он вернул 0, но выдает ошибку. То, что я делаю, чтобы справиться с этим, это попытка поймать:
catch (System.IndexOutOfRangeException)
numberOfBytesRead = 0;
... который завершает цикл и успешно завершает работу, но мы все знаем, что я не хочу контролировать поток кода с помощью обработки ошибок.
Есть ли лучший (более стандартный?) способ обработки чтения потока, когда длина потока неизвестна? Это кажется небольшим изъяном в довольно разумной стратегии чтения потоков, но я просто не знаю, ошибся ли я или что.
Специфика этого (который я немного подчистил для публикации) заключается в том, что MySqlDataReader попадает в столбец LARGEBLOB. Он работает, когда размер буфера больше, чем количество возвращаемых байтов, или когда количество возвращаемых байтов не кратно bufferSize
. Потому что в этом случае мы не бросаем IndexOutOfRangeException
.