2011-02-10 11 views
65

Domanda:FileStream vs/differenze StreamWriter?

Che differenza c'è tra FileStream e StreamWriter in dotnet?

Quale contesto si suppone utilizzarlo? Qual è il loro vantaggio e svantaggio?

È possibile combinare questi due in uno?

risposta

79

Che differenza c'è tra FileStream e StreamWriter in dotnet?

A FileStream è un Stream. Come tutti gli stream, tratta solo i dati byte[].

A StreamWriter : TextWriter, è un Stream-decoratore. Un TextWriter codifica i dati di testo come stringa o char a byte[] e quindi li scrive sul collegamento Stream collegato.

Quale contesto si suppone utilizzarlo? Qual è il loro vantaggio e svantaggio?

Si utilizza un FileStream nullo quando si dispone di dati byte[]. Aggiungi un StreamWriter quando vuoi scrivere del testo. Utilizzare un formattatore o un serializzatore per scrivere dati più complessi.

È possibile combinare questi due in uno?

Sì. Hai sempre bisogno di un flusso per creare uno StreamWriter. Il metodo di supporto System.IO.File.CreateText("path") li creerà in combinazione e quindi dovrai solo eliminare() lo scrittore esterno.

+1

È anche importante notare che 'FileStream' è un tipo di stream, specificamente adattato ai file. Gli stream funzionano nativamente con byte, tuttavia 'StreamWriter'/Reader scriverà/leggerà testo su * qualsiasi * stream, non solo' FileStream's. Ad esempio, 'MemoryStreams',' NetworkStreams', ecc. – iliketocode

18

FileStream scrive byte, StreamWriter scrive testo. È tutto.

+11

In realtà, non è "tutto" ... Ma è una differenza corretta. – David

14

Un FileStream è esplicitamente destinato ai file di lavoro.

Uno StreamWriter può essere utilizzato per lo streaming a qualsiasi tipo di Stream - socket di rete, file, ecc

ScottGu spiega i diversi oggetti Stream abbastanza bene qui: http://www.codeguru.com/Csharp/Csharp/cs_data/streaming/article.php/c4223

+1

Riferimento eccellente per gli stream, sebbene non riguardi i flussi R/W di accesso casuale. Soprattutto le informazioni di serializzazione/deserializzazione e la dimostrazione di flussi non file sono molto utili. +1 – ThunderGr

7

Bene, da MSDN per FileStream :

Espone un flusso attorno a un file, supportando entrambe le operazioni di lettura e scrittura sincrone e asincrone.

e MSDN per StreamWriter:

Implementa un TextWriter per la scrittura di caratteri in un flusso in una particolare codifica.

La differenza più evidente è che FileStream permette operazioni di lettura/scrittura, mentre StreamWriter è scrivere soltanto.

La pagina StreamWriter prosegue aggiungendo:

StreamWriter è progettato per l'uscita di caratteri in una codifica particolare, mentre le classi derivate da flusso sono progettati per l'input e l'output di byte.

Quindi una seconda differenza è che FileStream è per byte, mentre StreamWriter è per il testo.

5

Sono due livelli diversi utilizzati per l'emissione di informazioni su origini dati note.

Un FileStream è un tipo di Stream, che concettualmente è un meccanismo che punta a una posizione e può gestire i dati in entrata e/o in uscita da e verso quella posizione. Gli stream esistono per la lettura/scrittura di file, connessioni di rete, memoria, pipe, console, debug e trace listers e alcuni altri tipi di fonti di dati. In particolare, esiste un FileStream per eseguire operazioni di lettura e scrittura sul file system. La maggior parte degli stream sono di livello piuttosto basso nel loro utilizzo e gestiscono i dati come byte.

Un StreamWriter è un wrapper per un flusso che semplifica l'utilizzo di tale flusso per l'output di testo normale. Espone metodi che accettano stringhe invece di byte ed esegue le conversioni necessarie da e verso gli array di byte. Ci sono altri scrittori; l'altro principale che useresti è XmlTextWriter, che facilita la scrittura di dati in formato XML. Ci sono anche le controparti Reader degli Scrittori che avvolgono in modo simile un flusso e facilitano il recupero dei dati.

0

Una differenza chiave (in aggiunta ai commenti precedenti) potrebbe essere che FileStream supporti l'acceess del disco casuale per leggere e scrivere su qualsiasi FileStream.Position specificato. Per modifiche di file di grandi dimensioni, può essere inestimabile.