Qual é a diferença entre PrintStream
e PrintWriter
? Eles têm muitos métodos em comum, devido aos quais eu costumo misturar essas duas classes. Além disso, acho que podemos usá-los exatamente para as mesmas coisas. Mas tem que haver uma diferença, caso contrário, haveria apenas uma classe.
Pesquisei nos arquivos, mas não consegui encontrar esta pergunta.
java
io
printwriter
printstream
Martijn Courteaux
fonte
fonte
Respostas:
Isso pode parecer irreverente, mas
PrintStream
imprime em umOutputStream
ePrintWriter
imprime em umWriter
. Ok, duvido que receba algum argumento por afirmar o óbvio. Mas tem mais.Então, qual é a diferença entre an
OutputStream
e aWriter
? Ambos são fluxos, sendo a principal diferença aOutputStream
um fluxo de bytes, enquanto aWriter
é um fluxo de caracteres.Se um
OutputStream
lida com bytes, o que dizerPrintStream.print(String)
? Ele converte caracteres em bytes usando a codificação da plataforma padrão. Usar a codificação padrão geralmente é uma coisa ruim, pois pode levar a erros ao passar de uma plataforma para outra, especialmente se você estiver gerando o arquivo em uma plataforma e consumindo-o em outra.Com a
Writer
, você normalmente especifica a codificação a ser usada, evitando dependências da plataforma.Por que se preocupar em ter um
PrintStream
no JDK, já que a intenção principal é escrever caracteres, e não bytes?PrintStream
é anterior ao JDK 1.1 quando os fluxos de caracteres do Reader / Writer foram introduzidos. Eu imagino que a Sun teria se tornado obsoletaPrintStream
se fosse tão amplamente usada. (Afinal, você não deseja que cada chamadaSystem.out
gere um aviso de API descontinuado! Além disso, alterar o tipo dePrintStream
paraPrintWriter
nos fluxos de saída padrão teria quebrado os aplicativos existentes.)fonte
PrintStream
não se limita ao uso da codificação padrão da plataforma; existem construtores que aceitam um nome de conjunto de caracteres. Assim, as distinções entrePrintStream
ePrintWriter
são que aPrintWriter
não pode escrever bytes brutos e as duas classes agrupam tipos diferentes de destinos.PrintStream
.print()
São funções de conveniência que chamamwrite()
; portanto, elas acionam o autoflush se ativado.PrintWriter
por outro lado, não será liberado automaticamente após uma chamada paraprint()
. Eu tenho demonstrado alguns iniciantes em Java hoje e isso chamou a atenção de alguns estudantes que não estavam familiarizados com a necessidade de liberar manualmente. Caso contrário, sua resposta é ótima.Com o que
PrintStream
você está preso à codificação padrão da plataforma.Com o
PrintWriter
você pode, no entanto, passar umOutputStreamWriter
com uma codificação específica.A vantagem é que você pode controlar o código que os caracteres devem ser escritos, para que não acabem como mojibake .
fonte
PrintStream(OutputStream out, boolean autoFlush, String encoding)
Desde o JDK 1.4, é possível especificar a codificação de caracteres para um PrintStream. Portanto, as diferenças entre PrintStream e PrintWriter são apenas sobre o comportamento de liberação automática e que um PrintStream não pode quebrar um Writer.
fonte
Escritores como PrintWriter são para saída de texto, fluxos são para saída binária. Os escritores lidam com coisas do conjunto de caracteres para você. Os fluxos não o fazem porque se supõe que você não deseja esse tipo de conversão, o que prejudicaria seus dados binários e, se você preferir, usaria um gravador.
fonte
Você pode gravar bytes não processados em um fluxo e não em um gravador. O javadoc PrintWriter lista as outras diferenças (o mais importante é poder definir uma codificação em um fluxo para que ele possa interpretar os bytes brutos que eu diria).
fonte
do núcleo java por Horstmann
fonte
O Printwriter é um aprimoramento do fluxo de impressão.
IE imprime o fluxo para uma finalidade específica.
fonte