Java IO (JavaSE 6) - Aiutami a capire gli effetti del mio utilizzo campione di flussi e Scrittori

StackOverflow https://stackoverflow.com/questions/2243441

  •  19-09-2019
  •  | 
  •  

Domanda

BufferedWriter out = new BufferedWriter( new OutputStreamWriter( new BufferedOutputStream( new FileOutputStream("out.txt") ) ) );

Quindi, vediamo se ho capito questo: Un flusso di byte di uscita è aperto per il file "out.txt". E 'poi inviata ad un flusso di output buffer per rendere le operazioni di file più veloce. Il flusso tamponato viene alimentata ad uno scrittore flusso di output per colmare byte in caratteri. Infine, questo scrittore viene alimentata ad uno scrittore tamponata ... che aggiunge un altro strato di buffer?

Hmm ...

È stato utile?

Soluzione

Sì lei ha ragione.

Credo che in questo caso si potrebbe fare molto più breve (vedi anche BufferedWriter )

BufferedWriter out = new BufferedWriter(new FileWriter("foo.out"));

o se si desidera funzioni bello di stampa:

PrintWriter out = new PrintWriter (nuova BufferedWriter (nuova FileWriter ( "foo.out")));

E 'forse che il FileWriter crea il proprio involucro, ma quella classe saprà qual è il migliore.

In Java Torrenti e scrittori sono involucri in modo da poterli montare alle proprie esigenze (per mezzo di loro impilamento come si fa). Le classi non guardano che tipo di flusso / scrittore si impilano su. Nel tuo caso con diversi buffer significherà in realtà hanno due buffer, in due classi diverse. Questo significa che prenderanno un po 'di memoria in più e forse qualche perdita di prestazioni, ma molto probabilmente non si sarà mai notare questo (perché è solo un po' in testa rispetto ad altri fattori di prestazioni).

Altri suggerimenti

Questo è un esempio di modello decoratore . L'idea è quella di aggiungere funzionalità a una classe senza modificare la classe. Nel tuo esempio si dispone di un FileWriter. Si desidera ciò che si scrive per essere tamponato (buona idea se è in rete) prima prima di scrivere. Così utilizzi questa BufferedWriter in cima FileWriter. Altre applicazioni potrebbero non voler i dati da buffer in modo che gli sviluppatori non avranno bisogno di aggiungere un BufferedWriter.

Non possiamo anticipare quello che tutti gli sviluppatori avranno bisogno. Diciamo che è necessario rot13 i dati, ora invece di modificare FileWriter, si crea un Rot13Writer chiamata di classe che implementa Writer. Il Rot13Writer prenderà un'istanza di Writer e si esibirà rot13 prima di passarlo al prossimo scrittore.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top