Sobes.tech
Middle

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:

  1. 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, BufferedInputStream envolve outro InputStream.

  2. Acesso sequencial: Os dados no stream são lidos ou escritos sequencialmente.

  3. 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();
    }
    
  4. 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 array b. Retorna o número de bytes lidos ou -1.
    • read(byte[] b, int off, int len): Lê até len bytes com deslocamento off no array b.
    • 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:

  • InputStream
    • FileInputStream
    • BufferedInputStream
    • ObjectInputStream (para serialização)
    • ...
  • OutputStream
    • FileOutputStream
    • BufferedOutputStream
    • ObjectOutputStream (para serialização)
    • ...
  • Reader
    • FileReader
    • BufferedReader
    • InputStreamReader
    • ...
  • Writer
    • FileWriter
    • BufferedWriter
    • OutputStreamWriter
    • ...

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.