Brauchen Sie Hilfe Verständnis Stream.Read()
Ich bin ein wenig verwirrt, als Sie die Schritte des Lesens einer Datei in den buffer schrittweise.
aus der MSDN docs
public abstract int Read(
byte[] buffer,
int offset,
int count
)
Quelle von C# - Beispiele
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
kann ich sagen, dass die Linie fileStream.Read(buffer, sum, length - sum)
liest sich wie "Lesen fileStream
aus sum
(offset) zu length - sum
(total bytes zu Lesen) in buffer
". OK also am Anfang, wenn sum
= 0, I effektiv Lesen Sie die gesamte fileStream in Puffer 1 kurz, aber ich denke, dies ist nicht der Fall. Vielleicht Read()
liest, was es möglicherweise können in den buffer? kehrt dann zurück, so dass Sie Read()
es wieder? Ich bin ein wenig verwirrt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Read
wird Lesen, was verfügbar ist (Sperrung bis etwas verfügbar ist), aber es möglicherweise nicht genügend Daten bereit, die zum füllen der Puffer, um mit zu beginnen.Stellen Sie sich das herunterladen von Daten über das Netzwerk - es kann sein, Megabyte Daten herunterladen, sondern nur einige es ist verfügbar, um mit zu beginnen. So müssen Sie zu halten, ruft
Read()
bis Sie gelesen habe, so viel wie Sie wollen.Stream.Read
Lesen bei den meisten die Anzahl der bytes, die Sie gebeten haben, kann aber einfach weniger Lesen. Zugegeben, für die lokale Datei-streams, ich vermute, es liest immer so viel, wie Sie gebeten haben, es sei denn, die Datei ist kürzer, aber das ist nicht wahr von Datenströmen im Allgemeinen, und ich glaube nicht, dass es garantiert auch für lokale Datei-streams.fileStream.Length
gesetzt werden, um die tatsächliche Gesamt-Länge? nicht nur, was verfügbar ist?fileStream.Length
wird die Länge der Datei auf die Zeit, Lesen Sie die Länge. Die Datei könnte sich ändern, die Länge zwischen damals und der Zeit, die Sie Lesen die Daten aber.blocking until something is available
, aber MSDN sagtReadBlock is a blocking version of Read.
was bedeutet, dass Read() nicht blockiert, aber ReadBlock() blockiert.StreamReader.ReadBlock
(das ist, was ich annehmen, du bist beziehe) wird blockiert, bis entweder alle die angeforderten Daten gelesen wurden oder das Ende des Streams erreicht wurde.Read
blockieren, bis etwas Daten Lesen - es ist immer noch blockiert.Den
Read
Methode liest mindestens ein byte und maximal die angegebene Anzahl bytes.Die Methode wird in der Regel zurück, alle Daten, die derzeit verfügbar ist. Wenn der Strom zum Beispiel kommt über das internet wird es in der Regel zurück, was es hat recieved zu weit, und für ein stream-Datei, wird es in der Regel wieder die gesamte Datei.
Jedoch, ist es bis zu der Implementierung zu entscheiden, was das beste Verhalten ist. Es könnte zum Beispiel zuerst zurückgeben, was Sie bekommen können aus dem Datei-cache, die können sofort zurückgegeben werden, und lassen Sie einen weiteren Anruf um die Daten zu erhalten, benötigen Sie eine aktuelle Festplatte gelesen.
Bei der Verwendung der
Read
- Methode, sollten Sie immer eine Schleife verwenden, so dass Sie sicher sind, um alle die Daten. Es scheint nicht notwendig, wenn der erste Anruf erscheint immer wieder alle Daten, aber es könnte Situationen geben, wo es nicht.fileStream.Length
gesetzt werden, um die tatsächliche Gesamt-Länge? nicht nur, was verfügbar ist?Length
Eigenschaft wird festgelegt, um die Gesamtlänge, wenn es verfügbar ist. Für einen Strom mit unbekannter Länge die Eigenschaft nicht verfügbar ist, und wirftNotSupportedException
. Ja, der Grund für diese Art des Lesens ein stream ist, dass es gelesen werden kann, schrittweise, entweder, weil ich die gesamte Datei zu viel Speicher verwendet, oder weil der gesamte stream ist noch nicht verfügbar.Aus der MSDN: