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.