2014-12-25 21 views
8

Questo mi ha infastidito. So che lo Stream è una classe astratta e quindi non può essere istanziato ma ha classi derivate da esso. Perché c'è un StreamReader classe e una Stream.Read() metodo (e viceversa per StreamWriter e Stream.Write())? È possibile scrivere su un file di testo utilizzando 3 milioni di metodi diversi ed è piuttosto frustrante cercare di comprendere tutti questi diversi tipi e metodi nello spazio dei nomi System.IO. Ho trovato domande e risposte riguardanti le differenze tra gli oggetti writer e reader o gli oggetti stream derivati ​​ma nulla riguardo a questo caso particolare.Qual è lo scopo di StreamReader quando Stream.Read() esiste?

+0

Poiché 'StreamReader' è astratto, è necessario un oggetto di una classe concreta, come' TextReader', per chiamare il metodo 'Stream.Read()'. La classe e il metodo non sono ridondanti. –

risposta

11

TextReader (che deriva da StreamReader) funziona con le stringhe. Stream funziona con byte. La conversione tra testo e byte viene eseguita da un Encoding.

Scegliere la classe giusta in base al contenuto del file di testo o binario.

È importante comprendere lo difference between text and bytes.

+0

'StreamReader' funziona con il testo. È derivato da 'TextReader'. Un 'StreamReader' * esegue il wrapping * di un' Stream' perché 'Stream' non supporta le operazioni basate sul testo. Come scriveresti una stringa su un file quando tutto ciò che hai è un 'Stream' ?! – usr

+0

Scusa, ignora il mio ultimo commento, ho letto male. Se un flusso funziona con byte, perché in questo caso Microsoft lo ha chiamato StreamReader se funziona con il testo? A volte la FCL può essere confusa. – Bagofsheep

+1

Avrebbero dovuto chiamarlo "StreamTextReader" o "StreamBasedTextReader". Pensa a quel nome come abbreviato ... Capisco la tua confusione perché ho avuto le stesse cose da dire quando ho imparato questo. Ha perfettamente senso quando hai qualche esperienza con questo concetto, però. – usr

2

A StreamReader è un TextReader che significa che è un wrapper Stream. Un TextReader convertirà (o codificherà) dati di testo (stringa o char) in byte [] e li scriverà nel sottostante Stream.

Osservando la differenza tra le due implementazioni, è possibile vedere che StreamReader deriva da TextReader, che, come dichiarato, riguarda il testo anziché i byte. Mi sembra un'astrazione per gli utenti che vogliono lavorare con la rappresentazione testuale. Ovviamente, l'implementazione sottostante avrà bisogno di un Stream per consumare tali dati, ma fornirà un livello di astrazione per gli utenti finali.

1

Questi due casi sono utilizzati in diversi scenari

Quando si utilizza la classe di flusso è possibile accedere al file in lettura e scrittura. Ma quando usi la classe streamreader puoi usarla per leggere solo. Ciò impedisce l'utilizzo del file da scrivere. A volte questa classe viene utilizzata per scopi di sicurezza. per esempio. per i file di sistema che sono di sola lettura.