Streams de Entrada e Saída em Java
A manipulação de arquivos e streams é uma característica fundamental em muitas linguagens de programação. Em Java, as funcionalidades essenciais para trabalhar com streams estão concentradas nas classes do pacote java.io
.
O termo "stream" (fluxo), no contexto de programação, pode ter diferentes significados. Ao abordar arquivos e operações de entrada e saída (I/O), um stream é uma abstração que representa uma sequência de dados, utilizada para operações de leitura e escrita em fontes como arquivos, soquetes de rede ou o console.
O sistema de I/O de Java conecta um stream a uma fonte ou destino físico de dados. É possível, por exemplo, associar um stream a um arquivo para ler seu conteúdo ou para escrever novos dados nele. Da mesma forma, um stream pode ser vinculado a um soquete de rede para enviar ou receber informações. Todas essas tarefas são gerenciadas por meio de streams.
Um objeto que permite a leitura de dados é conhecido como stream de entrada (input stream), enquanto um objeto que permite a escrita de dados é chamado de stream de saída (output stream). Por exemplo, para ler o conteúdo de um arquivo, se utiliza um stream de entrada; para gravar nele, um stream de saída.
Na base de todas as classes que gerenciam fluxos de bytes, encontram-se duas classes abstratas fundamentais: InputStream
, para streams de entrada, e OutputStream
, para streams de saída.
Como a manipulação direta de bytes pode ser complexa, foram introduzidas classes abstratas específicas para trabalhar com fluxos de caracteres: Reader
para leitura e Writer
para escrita.
Todas as outras classes que operam com streams herdam dessas classes abstratas. A seguir estão algumas das principais classes de stream disponíveis em Java:
Streams de Bytes (Entrada) | Streams de Bytes (Saída) | Streams de Caracteres (Leitura) | Streams de Caracteres (Escrita) |
---|---|---|---|
InputStream | OutputStream | Reader | Writer |
FileInputStream | FileOutputStream | FileReader | FileWriter |
BufferedInputStream | BufferedOutputStream | BufferedReader | BufferedWriter |
ByteArrayInputStream | ByteArrayOutputStream | CharArrayReader | CharArrayWriter |
FilterInputStream | FilterOutputStream | FilterReader | FilterWriter |
DataInputStream | DataOutputStream | ||
ObjectInputStream | ObjectOutputStream |
Streams de Bytes
A Classe InputStream
A classe InputStream
é a base para todos os streams de entrada de bytes. Seus principais métodos são:
int available()
: retorna a quantidade de bytes disponíveis para leitura no stream.void close()
: fecha o stream.int read()
: retorna a representação inteira do próximo byte no stream. Quando não há mais bytes disponíveis para leitura, o método retorna -1.int read(byte[] buffer)
: lê bytes do stream para o arraybuffer
e retorna o número de bytes lidos. Se nenhum byte for lido, retorna -1.int read(byte[] buffer, int offset, int length)
: lê uma quantidade de bytes igual alength
do stream para o arraybuffer
, começando a partir da posiçãooffset
. Retorna o número de bytes lidos com sucesso.long skip(long number)
: pula uma quantidade de bytes igual anumber
durante a leitura no stream.
A Classe OutputStream
A classe OutputStream
é a base para todos os streams de saída de bytes. Sua funcionalidade é implementada por meio dos seguintes métodos:
void close()
: fecha o stream.void flush()
: força a escrita de todos os dados mantidos no buffer para o destino.void write(int b)
: grava no stream de saída um único byte, representado pelo parâmetro inteirob
.void write(byte[] buffer)
: grava o conteúdo do array de bytesbuffer
no stream de saída.void write(byte[] buffer, int offset, int length)
: grava no stream de saída uma quantidade de bytes igual alength
do arraybuffer
, começando a partir da posiçãooffset
.
Streams de Caracteres
A Classe Abstrata Reader
A classe abstrata Reader
fornece a funcionalidade para a leitura de informações de texto. Seus principais métodos são:
abstract void close()
: fecha o stream de entrada.int read()
: retorna a representação inteira do próximo caractere no stream. Se o final do stream for alcançado, retorna -1.int read(char[] buffer)
: lê caracteres do stream para o arraybuffer
. Retorna o número de caracteres lidos com sucesso ou -1 ao atingir o final do stream.int read(CharBuffer buffer)
: lê caracteres do stream para um objetoCharBuffer
e retorna a quantidade de caracteres lidos. Retorna -1 ao atingir o final do stream.abstract int read(char[] buffer, int offset, int count)
: lê uma quantidade de caracteres igual acount
do stream para o arraybuffer
, começando a partir da posiçãooffset
.long skip(long count)
: pula uma quantidade de caracteres igual acount
. Retorna o número de caracteres pulados com sucesso.
A Classe Abstrata Writer
A classe Writer
define a funcionalidade para todos os streams de saída de caracteres. Seus principais métodos incluem:
Writer append(char c)
: adiciona o caracterec
ao final do stream de saída. Retorna o próprio objetoWriter
.Writer append(CharSequence chars)
: adiciona a sequência de caractereschars
ao final do stream. Retorna o próprio objetoWriter
.abstract void close()
: fecha o stream.abstract void flush()
: limpa os buffers do stream.void write(int c)
: grava no stream um único caractere, representado pelo seu valor inteiro.void write(char[] buffer)
: grava no stream um array de caracteres.abstract void write(char[] buffer, int off, int len)
: grava no stream uma quantidade de caracteres igual alen
do arraybuffer
, começando a partir do índiceoff
.void write(String str)
: grava uma string no stream.void write(String str, int off, int len)
: grava no stream uma quantidade de caracteres igual alen
da stringstr
, começando a partir do índiceoff
.
As funcionalidades descritas pelas classes Reader
e Writer
são herdadas por classes concretas, como FileReader
e FileWriter
, que são projetadas especificamente para a manipulação de arquivos de texto.
Resumo
- Streams são abstrações para leitura e escrita de dados de uma fonte ou para um destino.
- Streams de entrada (
InputStream
,Reader
) são usados para ler dados, enquanto streams de saída (OutputStream
,Writer
) são usados para escrever dados. InputStream
eOutputStream
são as classes base para a manipulação de fluxos de bytes, adequados para dados binários.Reader
eWriter
são as classes base para a manipulação de fluxos de caracteres, ideais para trabalhar com texto.- Métodos como
read()
,write()
,close()
eflush()
são fundamentais para o controle dos streams e o gerenciamento de recursos.