Diferença entre java.io.PrintWriter e java.io.BufferedWriter?

94

Por favor, olhe através do código abaixo:

// 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 é a diferença entre esses dois métodos?

Quando devemos usar PrintWriter em vez de BufferedWriter?

i2ijeya
fonte

Respostas:

61

A referência da API para BufferedWriter e PrintWriter detalha as diferenças.

A principal razão para usar o PrintWriter é obter acesso aos métodos printXXX como println (). Você pode essencialmente usar um PrintWriter para gravar em um arquivo da mesma forma que usaria System.out para gravar no console.

Um BufferedWriter é uma maneira eficiente de gravar em um arquivo (ou em qualquer outra coisa), pois armazenará os caracteres na memória Java antes (provavelmente, dependendo da implementação) de cair em C para fazer a gravação no arquivo.

Não existe um conceito como "PrintReader"; o mais próximo que você obterá é provavelmente java.util.Scanner .

TofuBeer
fonte
4
@TritonMan em algum momento ele precisa interagir com o sistema operacional, o que significa sair do Java.
TofuBeer
89

PrintWriterfornece mais métodos ( println), mas a diferença mais importante (e preocupante) a ter em conta é que engole exceções .

Você pode ligar checkErrormais tarde para ver se ocorreu algum erro, mas normalmente você usaria PrintWriterpara coisas como escrever no console - ou em aplicativos "rápidos e sujos" onde você não quer ser incomodado por exceções (e onde confiabilidade de longo prazo não é um problema).

Não sei por que os aspectos de "habilidades extras de formatação" e "não engula exceções" são agrupados na mesma classe - a formatação é obviamente útil em muitos lugares onde você não quer que as exceções sejam engolidas. Seria bom ver BufferedWriterobter as mesmas habilidades em algum momento ...

Jon Skeet
fonte
@WindyFields: Não, PrintStreamé um OutputStream. PrintWriteré um Writer.
Jon Skeet,
Obrigado. "engole exceções." Você quer dizer que PrintWriter não levanta exceções verificadas? Que tal exceções não verificadas?
@Ben: Eu estava falando especificamente sobre IOException, em que todas as outras abstrações de IO ( Reader, Writeretc) declaram que seus métodos lançam IOExceptionse algo der errado - PrintWriternão.
Jon Skeet de
8

Conforme dito na resposta de TofuBeer, ambos têm suas especialidades. Para aproveitar ao máximo o PrintWriter (ou qualquer outro gravador), mas também usar a gravação em buffer, você pode envolver o BufferedWriter com o necessário como este:

PrintWriter writer = new PrintWriter(
                         new BufferedWriter (
                             new FileWriter("somFile.txt")));
Kai Huppmann
fonte
2
Lembrando que @Jons comenta que o PrintWriter engolirá as exceções. checkError deve ser chamado.
MadMurf
1
Eu amei os tenenbaums reais
Ogen
4
Pelo menos na implementação atual do openJDK 8 (e provavelmente nas versões mais antigas), PrinterWriterjá cria um BufferedWriter.
nimrodm 01 de
7

PrintWriter apenas expõe os métodos de impressão em qualquer gravador em modo de caractere.

BufferedWriter é mais eficiente do que, de acordo com seus métodos de buffer. E vem com um método newLine (), dependendo da plataforma do seu sistema, para manipular arquivos de texto corretamente.

O BufferedReader permite ler um texto de um arquivo, com bytes convertidos em caracteres. Permite a leitura linha a linha.

Não há PrintReader, você deve escolher outra implementação do Reader de acordo com o formato de sua entrada.

Lioda
fonte
3

PrintWriter é o gravador mais avançado para gravar dados de caracteres em um arquivo.

A principal vantagem de PrintWriter sobre FileWriter e BufferedWriter é:

  1. PrintWriter pode se comunicar diretamente com o arquivo e também por meio de algum objeto Writer.

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

(ou)

FileWriter filewriter = new FileWriter("blah.txt");
PrintWriter printwiter = new PrintWriter(filewriter);
  1. Podemos escrever qualquer tipo de dados primitivos diretamente no arquivo (porque temos versões adicionais sobrecarregadas dos métodos PrintWriter, ou seja, print () e println ()).

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

Syed Maqsood
fonte
2

Em geral, um gravador envia sua saída imediatamente para o caractere subjacente ou fluxo de bytes. A menos que a saída de prompt seja necessária, é aconselhável envolver um BufferedWriter em torno de qualquer gravador cujas operações write () possam ser caras, como FileWriters e OutputStreamWriters. Por exemplo,

Nota: o conteúdo do texto nos blocos de código é automaticamente quebrado

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

armazenará em buffer a saída do PrintWriter no arquivo. Sem armazenamento em buffer, cada invocação de um método print () faria com que os caracteres fossem convertidos em bytes que seriam gravados imediatamente no arquivo, o que pode ser muito ineficiente.

Rohit Goyal
fonte
0

BufferedWriter - Grava texto em um fluxo de caracteres de saída, armazenando em buffer os caracteres de um fluxo de caracteres. PrintWriter - Imprime representações formatadas de objetos em um fluxo de saída de texto.

Vidyut Singhai
fonte
-1

Acho que a razão por trás do uso de PrintWriter já foi mencionada acima, mas uma das razões importantes é você passar um objeto de arquivo diretamente para o construtor PrintWriter, o que torna mais fácil usá-lo.

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