1. OutputStream
aula
Recentemente, exploramos os fluxos de entrada. É hora de falar sobre fluxos de saída.
A OutputStream
classe é a classe pai para todas as classes que suportam a saída de bytes. Esta é uma classe abstrata que não faz nada sozinha, mas possui classes descendentes para cada ocasião.
Parece extremamente complicado. Simplificando, essa classe opera em bytes e não, por exemplo, em caracteres ou outros tipos de dados. E o fato de ser abstrato significa que normalmente não o usamos, mas sim uma de suas classes descendentes. Por exemplo, FileOutputStream
e afins.
Mas voltando à OutputStream
aula. Esta classe tem métodos que todas as suas classes descendentes devem implementar. Aqui estão os principais:
Métodos | Descrição |
---|---|
|
Grava um byte (não um int ) no fluxo. |
|
Grava uma matriz de bytes no fluxo |
|
Grava parte de uma matriz de bytes no fluxo |
|
Grava todos os dados armazenados no buffer para o fluxo |
|
Fecha o fluxo |
Quando você cria um objeto de uma classe que herda InputStream
, geralmente especifica um objeto de origem do qual InputStream
lê os dados. Quando você cria um objeto de uma classe que herda OutputStream
, geralmente também especifica o objeto ou fluxo de destino no qual os dados serão gravados.
Vamos passar rapidamente por todos os métodos da OutputStream
classe:
write(int b)
método
Esse método grava um byte (não um int
) no fluxo de saída. O valor passado é convertido em um byte e os três primeiros bytes do int são descartados.
write(byte[] buffer)
método
Grava a matriz de bytes fornecida no fluxo de saída. É isso.
write(byte[] buffer, int offset, int length)
método
Grava uma parte da matriz de bytes transmitida no fluxo de saída. A variável offset indica o índice do primeiro elemento do array, e length
é o comprimento do subconjunto a ser escrito.
flush()
método
O flush()
método é usado para forçar qualquer dado potencialmente armazenado em buffer no fluxo atual a ser gravado no fluxo de destino. Isso é relevante ao usar armazenamento em buffer e/ou vários objetos de fluxo organizados em uma cadeia.
close()
método
Grava todos os dados não gravados no objeto de destino. O close()
método não precisa ser chamado se você usar um try-with-resources
bloco.
Exemplo de cópia de um arquivo
Código | Observação |
---|---|
|
InputStream para ler de um arquivo OutputStream para gravar em um arquivo Buffer no qual leremos os dados Enquanto houver dados no fluxo Ler dados no buffer Gravar os dados do buffer no segundo fluxo |
2. Writer
classe
A Writer
classe é exatamente igual à OutputStream
classe, mas apenas uma diferença mais uma vez: ela trabalha com caracteres ( char
) em vez de bytes.
Esta é uma classe abstrata: você não pode criar objetos da Writer
classe. Seu principal objetivo é ser uma classe pai comum para centenas de classes descendentes e fornecer a elas métodos comuns para trabalhar com fluxos de caracteres.
Métodos da Writer
classe (e todas as suas classes descendentes):
Métodos | Descrição |
---|---|
|
Grava um caractere (não um int ) no fluxo. |
|
Grava uma matriz de caracteres no fluxo |
|
Grava parte de uma matriz de caracteres no fluxo |
|
Grava uma string no stream |
|
Grava parte de uma string no stream |
|
Grava todos os dados armazenados no buffer para o fluxo |
|
Fecha o fluxo |
Os métodos são muito semelhantes aos métodos da OutputStream
classe, mas trabalham com caracteres em vez de bytes.
Descrição dos métodos:
write(int b)
método
Este método grava um único caractere ( char
— não um int
) no fluxo de saída. O valor passado é convertido em um char
e os dois primeiros bytes são descartados.
write(char[] buffer)
método
Grava a matriz de caracteres fornecida no fluxo de saída.
write(char[] buffer, int offset, int length)
método
Grava uma parte da matriz de caracteres transmitida no fluxo de saída. A offset
variável indica o índice do primeiro elemento da matriz e length
é o comprimento do subconjunto a ser escrito.
write(String str)
método
Grava a string fornecida no fluxo de saída.
write(String str, int offset, int length)
método
Grava uma parte da string fornecida no fluxo de saída: a string é convertida em uma matriz de caracteres. A offset
variável indica o índice do primeiro elemento da matriz e length
é o comprimento do subconjunto a ser escrito.
flush()
método
O flush()
método é usado para forçar qualquer dado potencialmente armazenado em buffer no fluxo atual a ser gravado no fluxo de destino. Isso é relevante ao usar armazenamento em buffer e/ou vários objetos de fluxo organizados em uma cadeia.
close()
método
Grava todos os dados não gravados no objeto de destino. O close()
método não precisa ser chamado se você usar um try-with-resources
bloco.
Exemplo de um programa que copia um arquivo de texto:
Código | Observação |
---|---|
|
Reader para ler de um arquivo Writer para gravar em um arquivo Buffer no qual leremos os dados Enquanto houver dados no fluxo Ler dados em um buffer Gravar os dados do buffer no segundo fluxo |
StringWriter
aula
Existe outra classe interessante que herda a Writer
classe: ela se chama StringWriter
. Ele contém uma string mutável — um StringBuffer
objeto. E toda vez que você "escreve" algo no StringWriter
objeto, o texto é simplesmente adicionado ao seu buffer interno.
Exemplo:
Código | Observação |
---|---|
|
Um fluxo de caracteres de destino ( StringWriter ) é criado Uma string é gravada no buffer dentro do StringWriter Uma string é gravada no buffer dentro do StringWriter Convertendo o conteúdo de um objeto em uma string |
Nesse caso, a StringWriter
classe é essencialmente um wrapper sobre a StringBuffer
classe, mas a StringWriter
classe é descendente da Writer
classe de fluxo e pode ser usada em cadeias de objetos de fluxo. Esta é uma propriedade bastante útil na prática.
GO TO FULL VERSION