Como são estruturados os fluxos de Input e Output em Java?
sobes.tech IA
Resposta da IA
Streams de Input e Output em Java representam uma abstração da fonte (para Input) e do recetor (para Output) de dados. São parte do pacote java.io.
Classes principais:
InputStream: Classe abstrata base para leitura de bytes.OutputStream: Classe abstrata base para escrita de bytes.Reader: Classe abstrata base para leitura de caracteres.Writer: Classe abstrata base para escrita de caracteres.
Trabalho com bytes e caracteres:
- Streams (
InputStream,OutputStream) trabalham com bytes. - Readers e Writers trabalham com caracteres, usando codificação (por exemplo, UTF-8) para converter bytes em caracteres e vice-versa.
Conceitos-chave:
-
Padrão Decorador (Wrapper): Muitas classes de streams são "decoradores" que envolvem outros streams para adicionar funcionalidades (por exemplo, bufferização, compressão de dados, conversão de tipos). Por exemplo,
BufferedInputStreamenvolve outroInputStream. -
Acesso sequencial: Os dados no stream são lidos ou escritos sequencialmente.
-
Fecho de streams: É importante fechar os streams após uso para liberar recursos do sistema (descritores de ficheiros, ligações de rede). Frequentemente usa-se
try-with-resources:// Exemplo de uso de try-with-resources try (InputStream is = new FileInputStream("file.txt")) { int data = is.read(); while (data != -1) { // Processar dados data = is.read(); } } catch (IOException e) { e.printStackTrace(); } -
Métodos de leitura/escrita:
read(): Lê um byte (ou caractere) ou devolve -1 no final do stream.read(byte[] b): Lê bytes para o arrayb. Retorna o número de bytes lidos ou -1.read(byte[] b, int off, int len): Lê atélenbytes com deslocamentooffno arrayb.- Métodos semelhantes
write()para escrever.
Exemplos de implementações específicas de Streams/Readers/Writers:
FileInputStream/FileOutputStream: Para trabalhar com ficheiros.ByteArrayInputStream/ByteArrayOutputStream: Para trabalhar com bytes em memória.PipedInputStream/PipedOutputStream: Para troca de dados entre streams no mesmo processo.SocketInputStream/SocketOutputStream: Para ligações de rede.BufferedReader/BufferedWriter: Para bufferizar leitura/escrita, o que melhora o desempenho.InputStreamReader/OutputStreamWriter: Para converter streams de bytes em caracteres e vice versa.
Hierarquia de classes:
InputStreamFileInputStreamBufferedInputStreamObjectInputStream(para serialização)- ...
OutputStreamFileOutputStreamBufferedOutputStreamObjectOutputStream(para serialização)- ...
ReaderFileReaderBufferedReaderInputStreamReader- ...
WriterFileWriterBufferedWriterOutputStreamWriter- ...
A escolha entre streams de bytes e de caracteres depende do tipo de dados: bytes para dados binários (imagens, ficheiros executáveis), caracteres para dados de texto.