Differenza tra java.io.PrintWriter e java.io.BufferedWriter?


94

Si prega di guardare il codice qui sotto:

// A.class
File file = new File("blah.txt");
FileWriter fileWriter = new FileWriter(file);
PrintWriter printWriter = new PrintWriter(fileWriter);

// B.class
File file = new File("blah.txt");
FileWriter fileWriter = new FileWriter(file);
BufferedWriter bWriter = new BufferedWriter(fileWriter);

Qual è la differenza tra questi due metodi?

Quando dovremmo usare PrintWriter su BufferedWriter?

Risposte:


61

Il riferimento API per BufferedWriter e PrintWriter dettaglia le differenze.

Il motivo principale per utilizzare PrintWriter è ottenere l'accesso ai metodi printXXX come println (). Puoi essenzialmente usare un PrintWriter per scrivere su un file proprio come useresti System.out per scrivere sulla console.

Un BufferedWriter è un modo efficiente per scrivere su un file (o qualsiasi altra cosa), poiché bufferizzerà i caratteri nella memoria Java prima (probabilmente, a seconda dell'implementazione) di cadere in C per scrivere sul file.

Non esiste un concetto come "PrintReader"; il più vicino che otterrai è probabilmente java.util.Scanner .


4
@TritonMan a un certo punto deve interagire con il sistema operativo, il che significa uscire da Java.
TofuBeer

89

PrintWriterfornisce più metodi ( println), ma la differenza più importante (e preoccupante) di cui essere consapevoli è che ingoia le eccezioni .

Puoi chiamare checkErrorpiù tardi per vedere se si sono verificati errori, ma in genere lo useresti PrintWriterper cose come scrivere sulla console o in app "veloci e sporche" in cui non vuoi essere disturbato dalle eccezioni (e dove l'affidabilità a lungo termine non è un problema).

Non sono sicuro del motivo per cui gli aspetti "capacità di formattazione extra" e "non ingoiare eccezioni" siano raggruppati nella stessa classe - la formattazione è ovviamente utile in molti posti dove non si desidera che le eccezioni vengano inghiottite. Sarebbe bello vedere BufferedWriterottenere le stesse abilità ad un certo punto ...


@ WindyFields: No, PrintStreamè un file OutputStream. PrintWriterè un Writer.
Jon Skeet

Grazie. "ingoia le eccezioni." Vuoi dire che PrintWriter non solleva eccezioni controllate? Che ne dici di eccezioni non controllate?

@ Ben: stavo parlando specificamente IOException, in quanto ogni altra astrazione IO ( Reader, Writerecc.) Dichiara che i suoi metodi lanciano IOExceptionse qualcosa va storto - PrintWriternon lo fa.
Jon Skeet

8

Come detto nella risposta di TofuBeer, entrambi hanno le loro specialità. Per sfruttare appieno PrintWriter (o qualsiasi altro scrittore) ma anche utilizzare la scrittura bufferizzata, puoi avvolgere BufferedWriter con quello necessario in questo modo:

PrintWriter writer = new PrintWriter(
                         new BufferedWriter (
                             new FileWriter("somFile.txt")));

2
Ricordando il commento di @Jons che PrintWriter ingoierà le eccezioni. checkError dovrebbe essere chiamato.
MadMurf

1
Ho adorato i tenenbaum reali
Ogen

4
Almeno nell'attuale implementazione di openJDK 8 (e probabilmente nelle versioni precedenti), PrinterWritercrea già un file BufferedWriter.
nimrodm

7

PrintWriter espone solo i metodi di stampa su qualsiasi writer in modalità carattere.

BufferedWriter è più efficiente di, secondo i suoi metodi bufferizzati. E viene fornito con un metodo newLine (), a seconda della piattaforma di sistema, per manipolare correttamente i file di testo.

Il BufferedReader permette di leggere un testo da file, con byte convertiti in caratteri. Permette di leggere riga per riga.

Non c'è PrintReader, devi scegliere un'altra implementazione di Reader in base al formato del tuo input.


3

PrintWriter è il writer più avanzato per scrivere dati di caratteri su un file.

Il vantaggio principale di PrintWriter su FileWriter e BufferedWriter è:

  1. PrintWriter può comunicare direttamente con il file e può comunicare anche tramite alcuni oggetti Writer.

PrintWriter printwriter = new PrintWriter("blah.txt");

(o)

FileWriter filewriter = new FileWriter("blah.txt");
PrintWriter printwiter = new PrintWriter(filewriter);
  1. Possiamo scrivere qualsiasi tipo di dati primitivi direttamente nel file (perché abbiamo versioni aggiuntive sovraccaricate dei metodi PrintWriter, ad esempio print () e println ()).

    printwriter.print(65); //65
    bufferedwriter.write(65); //A
    printwriter.println(true); //true


2

In generale, un writer invia immediatamente il proprio output al carattere o al flusso di byte sottostante. A meno che non sia richiesto un output del prompt, è consigliabile racchiudere un BufferedWriter attorno a qualsiasi writer le cui operazioni write () possono essere costose, come FileWriters e OutputStreamWriters. Per esempio,

Nota: il contenuto di testo nei blocchi di codice è automaticamente a capo automatico

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

memorizzerà l'output di PrintWriter nel file. Senza buffering, ogni invocazione di un metodo print () provocherebbe la conversione dei caratteri in byte che sarebbero poi scritti immediatamente nel file, il che può essere molto inefficiente.


0

BufferedWriter: scrive il testo in un flusso di caratteri di output, bufferizzando i caratteri da un flusso di caratteri. PrintWriter: stampa rappresentazioni formattate di oggetti in un flusso di output di testo.


-1

Penso che il motivo dell'utilizzo di PrintWriter sia già menzionato sopra, ma uno dei motivi importanti è che si passa un oggetto file direttamente al costruttore PrintWriter che lo rende facile da usare.

File file=new File(“newfile.txt”);
PrintWriter pw=new PrintWriter(file);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.