Java/Fluxos de entrada e saída

A entrada e saída de dados em Java é feita através de streams.

Uma stream é uma sequência ordenada de bytes ou caracteres de tamanho indefinido. Streams podem ser abertas e fechadas pelo programa; algumas vezes, estas operações são feitas de forma automática (normalmente em caso de erro).

Um programa que usa uma stream deve incluir a biblioteca java.io, ou seja, deve incluir logo no início:

  import java.io.*;

ou instruções equivalentes.

Assim como em C/C++, uma stream não é usada diretamente através do nome do arquivo; é preciso abri-la como um File para depois usar as operações em streams.

Por exemplo, o programa abaixo pega o arquivo "teste1.txt" e copia seu conteúdo (bit-a-bit) para o arquivo "teste2.txt":

  import java.io.*;

  public class exemplo_io {
      public static void main(String[] args) throws IOException {
          File inputFile = new File("teste1.txt");
          File outputFile = new File("teste2.txt");

          FileReader in = new FileReader(inputFile);
          FileWriter out = new FileWriter(outputFile);
          int c;

          while ((c = in.read()) != -1)
             out.write(c);

          in.close();
          out.close();
      }
  }

Explicações:

  File inputFile = new File("teste1.txt")
  File outputFile = new File("teste2.txt")

apenas associam os streams inputFile e outputFile aos nomes "teste1.txt" e "teste2.txt". Neste ponto, não foi dito que "teste1.txt" é entrada, nem que "teste2.txt" é saída (obvimente, os nomes inputFile e outputFile são apenas conveniência para o leitor do programa).

  FileReader in = new FileReader(inputFile);
  FileWriter out = new FileWriter(outputFile);

Neste ponto são criados os dois streams. in é o stream de entrada, e out é o stream de saída. Como, na declaração do main, previmos uma exceção no I/O, caso o arquivo de entrada "teste1.txt" não exista, será gerada uma mensagem de erro.

  int c;
  while ((c = in.read()) != -1)
    out.write(c);

c é um inteiro. read, enquanto houver elementos para serem lidos, retorna números naturais, e retorna -1 no final. write escreve este número. Este loop (extremamente ineficiente para arquivos grandes!) faz a cópia, caracter a caracter, do arquivo de entrada para o arquivo de saída.

  in.close();
  out.close();

fecha os streams.