Stream: cosa è successo dopo l'istanziazione ma prima di leggere?

3

Sto cercando di far affluire i flussi - il mio mondo è C # ma sospetto che i principi siano generali.

Comprendo il principio generale della lettura / scrittura di byte da / a un negozio. Tuttavia, ciò che non capisco, in particolare in uno scenario di lettura, è ciò che è successo quando hai creato un'istanza di uno stream (FileStream, ad esempio) ma non hai ancora richiamato alcun metodo di lettura.

per es.

var fileStream = new FileStream( "Test.txt", FileMode.Open )

A questo punto è disponibile la proprietà fileStream.Length . Questo mi porta a chiedermi quanto segue:

  • La classe FileStream ha già letto tutti i byte nel file e accertato la lunghezza del file?
  • Il file è stato in grado di riportarne la lunghezza su FileStream?
  • Il file è ora già caricato in memoria e il filestream offre che a me in modo frammentario?
  • Sto leggendo in memoria i byte del file nel momento in cui chiamo i metodi di lettura?
posta CptCoathanger 18.11.2015 - 12:46
fonte

3 risposte

2
  • Has the FileStream class already read all the bytes in the file and ascertained the length of the file?
  • Has the file been able to report its length to the FileStream?

In realtà puoi cercare te stesso nella fonte di riferimento . Sembra che usi Win32Native -API. Quindi, ottenere la lunghezza del flusso è fondamentalmente uguale a fare clic con il pulsante destro su un file e visualizzarne le "proprietà". La dimensione del file viene salvata come meta-dati. Quindi in breve; no, non legge l'intero file. Dall'alto alla fine, la maggior parte delle implementazioni di Stream non lo fanno, ciò vanificherebbe lo scopo dello streaming.

  • Is the file now already loaded into memory and the filestream is that up to me in a chunked fashion?

No, un FileStream è ciò che dice sullo stagno, un flusso di file, che "esegue lo streaming" dei dati dal file. Se copi FileStream in MemoryStream , allora è un flusso in memoria.

  • Am I reading into memory the file's bytes at the time I call the read methods?

Sì.
Per chiarire, quando chiami ReadByte() stai leggendo un byte in memoria, dai flussi Position . Quando chiami Read() stai leggendo la quantità specificata di byte in memoria (il tuo buffer ).

Uno dei punti principali di avere uno stream, non è quello di dover memorizzare qualcosa in memoria. Lo fa un array di byte, MemoryStream è in pratica un wrapper per un array / buffer di byte .

    
risposta data 18.11.2015 - 13:04
fonte
4

La risposta a tutte queste domande è: "Non lo sai!" .

Tieni presente che questa è una buona cosa. L'intero punto di una classe di stream è di astrarre dal noioso dettaglio di quanto leggere quando e dove allocare il buffer per archiviare materiale che è già stato fornito dal controller ma non ancora consegnato al chiamante. Se vuoi gestire tutto questo da solo, potresti anche non utilizzare uno stream e scegliere di lavorare direttamente con open() e read() chiamate. Di solito questo non è quello che vuoi, quindi una tipica classe di stream non solo gestisce i dettagli, ma in realtà li nasconde completamente.

    
risposta data 18.11.2015 - 12:54
fonte
1

Un FileStream ha la lunghezza memorizzata come dati sul file. Il file non è ancora stato letto. Pensa a un file di diversi GB: la lettura richiede molto tempo. Ma restituire la lunghezza è veloce.

Alcuni altri tipi di Stream non cercano il supporto e quindi non restituiscono Length. Vedi link .

Solo quando si legge dal file sono i byte effettivamente letti dal supporto in memoria. (A volte il sistema operativo potrebbe leggere i dati che non hai ancora letto, ma si tratta di un'implementazione del sistema operativo.)

    
risposta data 18.11.2015 - 12:53
fonte

Leggi altre domande sui tag