Aprendendo A Manipular Arquivos em Java
Aprendendo A Manipular Arquivos em Java
Aprendendo A Manipular Arquivos em Java
Guilherme Silveira
Que escrever e ler em arquivos? Este tutorial mostra o bsico das operaes de leitura e
escrita em arquivos, assim como outras simples operaes.
Introduo
Sendo Java uma linguagem orientada a objetos, nada mais claro que utilizar
classes e instncias delas (objetos) para lidar com a saida e entrada de dados
(input/output, abreviado: io). O java trata a entrada e sada como fluxos de dados
(os to chamados Streams), que voc tem pleno controle sobre eles.
Alm disso, a abstrao criada pela linguagem sobre os Streams to grande, que
muitas vezes voc est puxando/escrevendo dados em algum Stream, e voc no
sabe se eles esto vindo da internet, de um arquivo texto, ou do usurio que est
digitando no console. E o mais importante: no faz a menor diferena esta
infromao!
As classes ligadas a io esto nos pacotes java.io e java.nio (NEW io) e estarei
ensinando o bsico das classes responsveis pela leitura e gravao de arquivos de
modo no binrio, isto , tratando com Strings e caracteres. Este tutorial explicar
passo a passo o que acontece no cdigo, para que voc entenda perfeitamente o
que feito, e no decore simplesmente o cdigo.
Por exemplo, o cdigo a seguir cria uma instncia da classe mencionada, que
aponta para /usr/guj/arquivo.txt:
Dica: No caso do sistema operacional windows, voc deve usar duplas barras
invertidas (\\), j que uma barra invertida apenas considerado escape pelo java!
Dica: Em java, voce NO tem como alterar o diretrio atual, por isso pode criar
instncias da classe File que apontam para lugares relativos, mas sempre ao
diretrio inicial, veja o segundo exemplo abaixo:
1
2
3
4
5
6
7
File
File
File
File
File
File
File
Vamos mostrar um pouco mais da API desta classe, para que voc saiba o que tem
disponvel.
1 boolean exists();
2 boolean isDirectory();
3 boolean isFile();
Outros mtodos que podem ser teis para checar a viabilidade de leitura e grava
sao:
1 boolean canRead();
2 boolean canWrite();
E por fim, alguns mtodos de criao de diretrios, sendo o primeiro o que cria um
diretrio e o segundo cria todos os diretrios necessarios para chegar no caminho
apontado pelo objeto. Esses costumam ser muito utilizados:
1 boolean mkdir();
2 boolean mkdirs();
1
2
3
4
classe, pois ela deixa voc instanci-la mesmo que ela no represente um arquivo
realmente, o que no acontece com as classes a seguir.
Para escrever (e ler de) em um arquivo precisamos saber que Java tem duas
camadas de io. Um baixo que le e escreve bytes e um alto que escreve e le
caracteres. Vamos estudar os de alto nvel, juntamente com algum encapsulando
por cima deste, pois o de alto nvel mexe com chars, e o que encapsula mexe com
tudo!
1
2
3
4
FileWriter
FileWriter
FileWriter
FileWriter
writer
writer
writer
writer
=
=
=
=
new
new
new
new
FileWriter(new File("saida.txt"),true);
FileWriter(new File("saida.txt"));
FileWriter("saida.txt",true);
FileWriter("saida.txt");
Repare que as duas primeiras linhas obtm o mesmo resultado que a terceira e a
quarta, pois existem construtores para objetos do tipo File e String.
Dica: especificando o segundo parametro como true, os dados sero enviados para o arquivo a toda
Repare que voc utiliza um objeto da classe java.io.PrintWriter sempre! o System.out uma instnc
Agora voc j pode escrever no arquivo que abriu:
1 saida.println("Camera's ready,");
2 saida.println("Prepare to flash....");
3 saida.println("Green Velvet");
Por fim, voce deve fechar o arquivo na ordem contrria que abriu, por segurana:
1 saida.close();
2 writer.close();
Dica: Nunca se esquea de fechar esses objetos, que liberam recursos para o
sistema. Esperar pelo Garbage Collector pode ser a diferena da sua aplicao
rodar rpido ou no!
Assim como sobre a escrita, voc deve dar uma lida na API das classes
java.io.FileInputStream e java.io.InputStreamWriter para utilizar de mtodos
compatveis com caracteres UNICODE.
O leito de caracteres que iremos usar durante a leitur sera uma instncia da
classe java.io.FileReader:
1 leitor.close();
2 reader.close();
Caso voce no utilize um objeto BufferedWriter no meio, voce ter como resultado
uma converso de caracteres em bytes e gravao no arquivo a cada chamada do
De exerccio, fica ler um arquivo e gravar uma cpia dele alterando todas as
aparies de uma determinada String em uma outra, da maneira mais eficiente
possvel!