2009-11-17 13 views
76

Si prega di guardare attraverso il codice qui sotto:Differenza tra java.io.PrintWriter e java.io.BufferedWriter?

// 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 utilizzare PrintWriter su BufferedWriter?

risposta

49

http://java.sun.com/javase/6/docs/api/java/io/BufferedWriter.html e http://java.sun.com/javase/6/docs/api/java/io/PrintWriter.html dettaglio le differenze.

Il motivo principale per utilizzare PrintWriter è ottenere l'accesso ai metodi printXXX (come println (int)). È possibile utilizzare essenzialmente un PrintWriter per scrivere su un file proprio come si farebbe con System.out per scrivere sulla console.

Un BufferedWriter è un modo efficace per scrivere su un file (o qualsiasi altra cosa) poiché memorizza i caratteri nella memoria Java prima (probabilmente, a seconda dell'implementazione) passando a C per scrivere il file.

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

+1

"passando a C per scrivere il file". .... UGH ... –

+2

@TritonMan a un certo punto ha bisogno di interagire con il sistema operativo, il che significa uscire da Java. – TofuBeer

72

PrintWriter dà più metodi (println), ma il più importante (e preoccupante) differenza di essere a conoscenza di è che inghiotte eccezioni.

È possibile chiamare in seguito checkError per verificare se si sono verificati errori, ma in genere si utilizza PrintWriter per cose come scrivere sulla console - o in app "veloci" e sporche dove non si desidera essere infastidito dalle eccezioni (e dove l'affidabilità a lungo termine non è un problema).

io non sono sicuro perché le "abilità di formattazione in più" e "non ingoiare eccezioni" aspetti vengono raggruppati nella stessa classe - formattazione è ovviamente utile in molti posti dove si non si vuole eccezioni di essere ingerito. Sarebbe bello vedere BufferedWriter ottenere le stesse abilità ad un certo punto ...

+0

@WindyFields: No, 'PrintStream' è un' OutputStream'. 'PrintWriter' è un' Writer'. –

7

Come detto nella risposta di TofuBeer entrambi hanno le loro specialità. Per trarre il massimo vantaggio di PrintWriter (o qualsiasi altro scrittore), ma anche usare la scrittura tamponata si può avvolgere la BufferedWriter con il necessario uno come questo:

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

Ricordando che @Jons commenta che PrintWriter ingerisce le eccezioni. checkError dovrebbe essere chiamato. – MadMurf

+1

Ho adorato i tenenbaum reali – Ogen

+1

Almeno nell'attuale implementazione di openJDK 8 (e probabilmente versioni precedenti), 'PrinterWriter' crea già un' BufferedWriter'. – nimrodm

6

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

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

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

Non c'è PrintReader, è necessario scegliere un'altra implementazione Reader in base al formato del proprio input.

+0

Dal momento che è un flusso di caratteri da cui provengono i "byte" ... – i2ijeya

-1

Penso che la ragione di utilizzo di PrintWriter sia già stata citata in precedenza, ma una delle ragioni importanti è che si passa un oggetto file direttamente al costruttore di PrintWriter che lo rende facile da usare.

File file=new File(“newfile.txt”); 
PrintWriter pw=new PrintWriter(file); 
1

In generale, un writer invia immediatamente l'output al carattere sottostante o al flusso di byte. A meno che non sia richiesto un output immediato, è consigliabile avvolgere un BufferedWriter attorno a qualsiasi Writer le cui operazioni write() potrebbero essere costose, come FileWriters e OutputStreamWriters. Ad esempio,

Nota: il contenuto di testo nei blocchi di codice viene automaticamente word-wrapped

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

sarà buffer di output del PrintWriter al file. Senza il buffering, ogni invocazione di un metodo print() causerebbe la conversione dei caratteri in byte che verrebbero quindi scritti immediatamente nel file, il che può essere molto inefficiente.

0

BufferedWriter - Scrive il testo in un flusso di caratteri di output, memorizzando i caratteri da un flusso di caratteri. PrintWriter - Stampa rappresentazioni formattate di oggetti in un flusso di output di testo.