Escrever e Ler arquivos com Java

Manipulando arquivos com Java

Praticamente todos que trabalham com desenvolvimento, de uma forma ou de outra, acabam tendo que manipular arquivos, sejam eles de texto, planilhas ou gerar relatórios.
Neste post explicarei como manipular arquivos com Java, bem como escrever e ler arquivos no formato de texto (txt).

A manipulação de arquivos em Java acontece de forma simples e rápida, pois a linguagem dispõe de classes que executam praticamente todas as operações necessárias para tanto.

java.io.File

A classe File representa um arquivo ou diretório no sistema operacional. Importante saber que apenas REPRESENTA, não significa que o arquivo ou diretório realmente exista.

Para instanciar um objeto do tipo File:

File arquivo = new File( "/home/hallan/nome_do_arquivo.txt" );

Com o objeto instanciado, é possível fazer algumas verificações, como por exemplo se o arquivo ou diretório existe:

//verifica se o arquivo ou diretório existe
boolean existe = arquivo.exists();

Caso não exista, é possível criar um arquivo ou diretório:

//cria um arquivo (vazio)
arquivo.createNewFile();

//cria um diretório
arquivo.mkdir();

caso seja um diretório, é possível listar seus arquivos e diretórios através do método listFiles(), que retorna um vetor de File:

//caso seja um diretório, é possível listar seus arquivos e diretórios
File [] arquivos = arquivo.listFiles();

É possível também excluir o arquivo ou diretório através do método delete(). Uma observação importante é que, caso seja um diretório, para poder excluir, este tem de estar vazio:

//exclui o arquivo ou diretório
arquivo.delete();


java.io.FileWriter e java.io.BufferedWriter

As classes FileWriter e BufferedWriter servem para escrever em arquivos de texto.

A classe FileWriter serve para escrever diretamente no arquivo, enquanto a classe BufferedWriter, além de ter um desempenho melhor, possui alguns métodos que são independentes de sistema operacional, como quebra de linhas.

Para instanciar um objeto do tipo FileWriter:

//construtor que recebe o objeto do tipo arquivo
FileWriter fw = new FileWriter( arquivo );

//construtor que recebe também como argumento se o conteúdo será acrescentado
//ao invés de ser substituído (append)
FileWriter fw = new FileWriter( arquivo, true );

A criação do objeto BufferedWriter:

//construtor recebe como argumento o objeto do tipo FileWriter
BufferedWriter bw = new BufferedWriter( fw );

Com o bufferedwriter criado, agora é possível escrever conteúdo no arquivo através do método write():

//escreve o conteúdo no arquivo
bw.write( "Texto a ser escrito no txt" );

//quebra de linha
bw.newLine();

Após escrever tudo que queria, é necessário fechar os buffers e informar ao sistema que o arquivo não está mais sendo utilizado:

//fecha os recursos
bw.close();
fw.close();

java.io.FileReader e java.io.BufferedReader

As classes FileReader e BufferedReader servem para ler arquivos em formato texto.

A classe FileReader recebe como argumento o objeto File do arquivo a ser lido:

//construtor que recebe o objeto do tipo arquivo
FileReader fr = new FileReader( arquivo );

A classe BufferedReader, fornece o método readLine() para leitura do arquivo:

//construtor que recebe o objeto do tipo FileReader
BufferedReader br = new BufferedReader( fr );

Para ler o arquivo, basta utilizar o método ready(), que retorna se o arquivo tem mais linhas a ser lido, e o método readLine(), que retorna a linha atual e passa o buffer para a próxima linha:

//equanto houver mais linhas
while( br.ready() ){
//lê a proxima linha
String linha = br.readLine();

//faz algo com a linha
}

Da mesma forma que a escrita, a leitura deve fechar os recursos:

br.close();
fr.close();

Agora, o código completo de escrita e leitura do arquivo:

public static void main(String[] args) {

File arquivo = new File("/home/hallan/nome_do_arquivo.txt");

try {

if (!arquivo.exists()) {
//cria um arquivo (vazio)
arquivo.createNewFile();
}

//caso seja um diretório, é possível listar seus arquivos e diretórios
File[] arquivos = arquivo.listFiles();

//escreve no arquivo
FileWriter fw = new FileWriter(arquivo, true);

BufferedWriter bw = new BufferedWriter(fw);

bw.write("Texto a ser escrito no txt");

bw.newLine();

bw.close();
fw.close();

//faz a leitura do arquivo
FileReader fr = new FileReader(arquivo);

BufferedReader br = new BufferedReader(fr);

//equanto houver mais linhas
while (br.ready()) {
//lê a proxima linha
String linha = br.readLine();

//faz algo com a linha
System.out.println(linha);
}

br.close();
fr.close();

} catch (IOException ex) {
ex.printStackTrace();
}

}

Abraço!

Deixe um Comentário

29 Comentários.

  1. Opa, sempre boa dar uma lida nesse assunto!

    Abraços

  2. Muito bom!!!Agora é só estudar…Valeu

  3. Melhor tuto que encontrei na net sobre o assunto.
    Parabens!

  4. Eu estava meio confuso à respeito de arquivos e ainda estou em alguns pontos, mas este post me esclareceu muito sobre arquivos de texto em Java. Normalmente o que se encontra falando de arquivos é sempre confuso e complicado de se entender, mas explicando dessa forma fica bem melhor. Ótimo post! Eu seria grato se você tivesse um falando de arquivo binário… 😛

  5. valeu,foi muito util….

  6. João Vitor Oliveira

    Muito bom cara! Me ajudou muito! Valeu1

  7. Muito bom seu tutorial, mas faltou falar que para que o BufferedReader e o BufferedWritter funcionem, precisa usar o método flush();. Estava seguindo seu tutorial à risca, mas percebi que meus arquivos ficavam com 0kb de tamanho e vi que algo estava faltando…

    • Boa tarde Carlos,

      Não sei o que aconteceu no seu caso, mas veja a documentação oficial do java:
      http://docs.oracle.com/javase/7/docs/api/java/io/BufferedWriter.html

      A descrição do método close() diz:
      “Closes the stream, flushing it first. Once the stream has been closed, further write() or flush() invocations will cause an IOException to be thrown. Closing a previously closed stream has no effect.”

      Ou seja, ao chamar o método close, automaticamente ele faz o flush antes.
      Verifique se você está chamando o método close() em seu código.

      O método flush deve ser usado somente em casos onde é necessário imediatamente escrever o buffer no arquivo, ao invés de fazer isso somente ao finalizar a operação chamando o close.

      Um abraço

  8. Ótimo tutorial, Hallan!
    Testei o BufferedReader para fazer a busca em arquivo .rtf mas nao está funcionando… Ao escrever as linhas no console aparecem só os códigos de formatação.

    Como funciona a leitura desse tipo de arquivo?

    • Olá Daniel,

      Arquivos RTF (Rich Text Format) não são arquivos de texto simples. A leitura deste tipo de arquivo ocorre de forma diferente.
      Apesar de eu nunca ter utilizado, você pode tentar utilizar RTFEditorKit ou alguma biblioteca externa, como o jRTF ou Apache Tika.

      Um abraço

  9. Parabéns Hallan pelo tutorial.Funcionou perfeitamente,eu tenho uma pergunta eu consigo fazer quebra de linha dentro do arquivo txt através do código.

  10. Muito bom cara! Me ajudou a entender melhor! Vlw

  11. Hallan, muito bom este suporte ae cara… mas tenho uma dúvida. Digamos que eu queira ao invés de apagar um arquivo existes e substitui-lo, tem como eu somente adicionar uma linha a mais… como eu faria isto, seria tipo usando um “.next” sei lá? 😀

  12. tá legal o tutorial, tem uns aplicativos java, no meu site acima, se vc quiser dar uma olhada. escreva se precisar algo. valeu.

  13. Parabéns e muito obrigado pelo tutorial Hallan, muito explicativo mesmo, muito bom. Postado em 2011 e ajudando pessoas em 2013 “quase 2014…” e vai continuar ajudando com certeza! Valeu!

  14. Ótima explicação.Agora gostaria de saber como setar a posição da onde eu quero começar a leitura?

  15. Muito bom, Hallan. Parabéns. Simples e eficaz. Você tem arquivos binários, também?

  16. Execelente Tutorial, Obrigado!

  17. Muito obrigado!

  18. Muito bom, excelente explicação! Obrigado!

  19. Parabéns muito bom o tutorial me ajudou em um trabalho, a unica coisa que modifiquei foi tirar do main e botar em uma classe para poder chamar o método (escrever arquivo() e lerArquivo())

    Obrigado, parabéns pela didática.

  20. Que droga, vou ter que comentar só porque ajudou demais.

  21. Tutorial muito bom. Vai para os “favoritos”, pois é de grande valia. Parabéns….

  22. Parabéns pela aula! No Java, eu consigo ler uma linha ou X linhas de um arquivo.txt e só depois de alguns segundos ler outra? Tipo no início dos filmes que aparece um nome, some, aparece outro nome, some, aparece outro, etc ??

  23. Valeu amigo. 🙂

Deixe um Comentário


NOTA - Você pode usar estesHTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>