Java: Differenza tra PrintStream e PrintWriter

Qual è la differenza tra PrintStream e PrintWriter ? Hanno molti metodi in comune a causa dei quali mescolo spesso queste due classi. Inoltre, penso che possiamo usarli esattamente per le stesse cose. Ma ci deve essere una differenza, altrimenti, ci sarebbe stata solo una class.

Ho cercato negli archivi, ma non ho trovato questa domanda.

Questo potrebbe sembrare PrintStream , ma PrintStream stampa su un OutputStream e PrintWriter stampa su un Writer . Ok, dubito che otterrò punti per affermare l’ovvio. Ma c’è di più.

Quindi, qual è la differenza tra un OutputStream e un Writer ? Entrambi sono flussi, con la differenza principale che un OutputStream è un stream di byte mentre un writer è un stream di caratteri.

Se un OutputStream occupa di byte, per quanto riguarda PrintStream.print(String) ? Converte i caratteri in byte usando la codifica della piattaforma predefinita. L’uso della codifica predefinita è generalmente una cosa negativa in quanto può portare a bug quando si passa da una piattaforma all’altra, soprattutto se si sta generando il file su una piattaforma e consumandolo su un’altra.

Con un Writer , in genere si specifica la codifica da utilizzare, evitando qualsiasi dipendenza dalla piattaforma.

Perché preoccuparsi di avere un PrintStream nel JDK, dal momento che l’intento principale è scrivere caratteri e non byte? PrintStream anteriore a JDK 1.1 quando sono stati introdotti i flussi di caratteri Reader / Writer. Immagino che Sun avrebbe deprecato PrintStream se solo per il fatto che è così ampiamente usato. (Dopo tutto, non si vorrebbe che ogni chiamata a System.out generasse un avvertimento api deprecato! Inoltre, la modifica del tipo da PrintStream a PrintWriter sui flussi di output standard avrebbe interrotto le applicazioni esistenti.)

Con PrintStream sei bloccato alla codifica predefinita della piattaforma.

 PrintStream stream = new PrintStream(output); 

Con PrintWriter puoi comunque passare un OutputStreamWriter con una codifica specifica.

 PrintWriter writer = new PrintWriter(new OutputStreamWriter(output, "UTF-8")); 

Il vantaggio è, beh, che è ansible controllare la codifica dei caratteri che i caratteri dovrebbero essere scritti in modo tale che alla fine non finiscano come mojibake .

Dal momento che JDK 1.4 è ansible specificare la codifica dei caratteri per un PrintStream. Pertanto, le differenze tra PrintStream e PrintWriter riguardano solo il comportamento del flussaggio automatico e che un PrintStream non può avvolgere un writer.

Scrittori come PrintWriter sono per l’output di testo, i flussi sono per l’output binario. Gli scrittori gestiscono i set di caratteri per te. Gli stream non lo fanno perché si presume che tu non voglia quel tipo di conversione, il che farebbe confondere i tuoi dati binari e, se lo facessi, utilizzeresti uno scrittore.

È ansible scrivere byte non elaborati su un stream e non su un writer. Il PrintWriter javadoc elenca le altre differenze (la cosa più importante è che è ansible impostare una codifica su uno stream in modo che possa interpretare i byte grezzi che direi).

Printwriter è un miglioramento di printstream.

Printstream di IE per uno scopo specifico.