Supponiamo di avere un blocco di codice come questo:flusso Leggi Problema
//Assuming s is a stream:
byte[] data = new byte[1000];
s.Read(data,0,data.Length);
il metodo Read potrebbe leggere ovunque da 1 a 1000 byte, lasciando la equilibrio del torrente letto.
Questo è ciò che un libro C# dice.
Non capisco, perché il metodo Read
dovrebbe leggere ovunque dal flusso? Non sta leggendo tutto il flusso?
E dice il work-around dovrebbe essere come questo:
//bytesRead will always end up at 1000, unless the stream is itself smaller in length:
int bytesRead = 0;
int chunkSize = 1;
while(bytesRead < data.Length && chunkSize > 0)
bytesRead += chunkSize = s.Read(data,bytesRead,dataLength-bytesRead);
Questo codice di cui sopra è fornito anche dal libro come un work-around. Quello che sto cercando di capire se il metodo Read sta iniziando a leggere fino alla fine e scrivere tutti i byte nell'intervallo specificato sull'array di byte. Perché sta usando il bytesRead
come punto di partenza in s.Read(data,bytesRead,dataLength-bytesRead);
Grazie in anticipo.
Vuol dire che prima inviano la dimensione dei dati che vogliono inviare e poi inviano l'intero dato come parte di un blocco invece di inviarlo nel suo complesso? – Tarik
Di solito sì. Supponiamo che tu abbia un file da 40 MB sul disco che vuoi trasferire. Anziché caricare 40 MB in memoria, quindi trasferirlo - e quindi rendere 40 MB di memoria affollati per un certo periodo di tempo - basta leggere, diciamo i primi 1024 byte, trasferirlo e continuare in blocchi da 1024 byte. Un protocollo di trasferimento file può dichiarare "i primi due byte del primo pacchetto contiene un int non firmato che indica la dimensione del payload" in modo da sapere quando interrompere la lettura da quel flusso. La parte ricevente può fare lo stesso, inserendola in 1024 byte o in un altro numero di buffer amichevole. – cfeduke