Manipulação de Arquivos Texto em Java

O conteúdo a seguir foi extraído do professor Fábio Tirelo da Puc Minas.

Disciplina em questão desse assunto é de Algoritmos e Estrutura de Dados I

1 - Considerações Iniciais

Este texto tem por objetivo servir como um tutorial simples para a manipulação de arquivos texto em Java. A princípio, utilizaremos uma simplificação, fazendo somente leitura de uma linha por vez e a escrita de uma linha por vez. Além disso, não faremos tratamento de erros de entrada e saída, apenas sinalizaremos no cabeçalho do método main que um erro desta natureza pode ocorrer.


2 - Estrutura de um Programa que Manipule Arquivos

Para utilizar arquivos, inicialmente é necessário fazer duas modificações na estrutura de programação à qual estamos acostumados. Primeiramente, é necessário na primeira linha importar as classes do pacote java.io. Além disso, acrescentaremos no cabeçalho do método main uma indicação de que um erro de entrada e saída pode ocorrer durante a execução do programa.

Desta maneira, os programas ficarão como a seguir:

import java.io.*; // Importa todas as classes de manipulação de E/S

public class NomeClasse {

// throws... sinaliza que um erro de E/S pode ocorrer 

    public static void main(String args[]) throws IOException { 

... O programa vem aqui

    }

}

3 - Leitura de Arquivos Texto

3.1 - Classes e Métodos de Manipulação de Arquivos de Entrada

Para lermos dados de um arquivo, devemos criar uma variável do tipo BufferedReader, que será associada ao arquivo que será lido. Por exemplo, se desejarmos ler os dados do arquivo teste.txt, devemos associar uma variável a este arquivo, como mostrado abaixo:

BufferedReader arquivo = new BufferedReader(new FileReader("teste.txt"));

Nesta linha, supomos que o arquivo está no mesmo diretório do programa. Esta operação é também chamada de abertura do arquivo. Se desejarmos ler dados de um arquivo que esteja em outro diretório, basta indicar o caminho como no exemplo abaixo:

BufferedReader arquivo = new BufferedReader(new FileReader("c:/temp/teste.txt"));

Se o arquivo não existir, ocorrerá um erro de entrada e saída (FileNotFoundException), e a execução do programa terminará.

Para lermos os dados de um arquivo associado a uma variável, podemos utilizar o método readLine(), que lê uma linha e posiciona o cursor na linha seguinte. Durante a execução do programa, há um cursor indicando o local de leitura no arquivo. Quando o arquivo é aberto, o cursor é posicionado no seu início. Cada leitura posiciona na linha seguinte à linha corrente.

Por exemplo, o código abaixo lê três linhas do arquivo e imprime em uma única na tela.

Strings1=arquivo.readLine(), s2=arquivo.readLine(), s3=arquivo.readLine();

aed1.escreve(s1 + "\n" + s2 + "\n" + s3);


3.2 - Um Exemplo Completo

Se quisermos saber se todas as linhas foram lidas, podemos testar se a leitura anterior retornou a referência nula (null), como exemplificado abaixo:

import java.io.*; 

public class Exemplo01 { 

    public static void main(String args[]) throws IOException {

        BufferedReader arquivo = new BufferedReader(new FileReader("teste.txt"));

        String str = arquivo.readLine(); 

        while (str != null) {

            System.out.println(str);

            str = arquivo.readLine();

        }

        arquivo.close();

    }

}

Observe que na última linha do programa, fizemos uma chamada ao método close do arquivo para que o arquivo fosse fechado. O objetivo de fechar o arquivo é fazer a liberação de um recurso que não é mais útil, isto é, liberamos o uso do arquivo após lermos todo o seu conteúdo.


3.3 Leitura de Números de um Arquivo

Para lermos números inteiros de um arquivo, devemos ler cada linha, como mostrado no exemplo anterior, e fazer a conversão explícita de String para int por meio do método Integer.parseInt. Se desejarmos ler números de ponto flutuante, utiliza-se o método Double.parseDouble.

O exemplo abaixo lê uma sequência de números de um arquivo e mostra, ao final, a soma destes valores.

import java.io.*; 

public class Exemplo02 { 

    public static void main(String args[]) throws IOException {

        BufferedReader arquivo = new BufferedReader(new FileReader("teste.txt"));

        String str = arquivo.readLine(); 

        int numero, soma = 0; 

        while (str != null) { 

            numero = Integer.parseInt(str); 

            soma += numero; 

            str = arquivo.readLine();

        

        aed1.escreve("Soma = " + soma);

        arquivo.close();

    }

}

Esta leitura pode ainda ser melhorada para desconsiderar linhas em branco no arquivo. Para isso, basta fazer um teste para verificar se a linha é igual à string vazia, por meio do método equals.

import java.io.*; 

public class Exemplo03 { 

    public static void main(String args[]) throws IOException {

        BufferedReader arquivo = new BufferedReader(new FileReader("teste.txt"));

        String str = arquivo.readLine(); 

        int numero, soma = 0; 

        while (str != null) { 

            if(! str.equals("")) { // Se string não for igual à string vazia numero = Integer.parseInt(str); 

                soma += numero;

            

            str = arquivo.readLine();

        

        aed1.escreve("Soma = " + soma);

        arquivo.close();

    }

}

4 - Escrita em Arquivos Texto

4.1 - Classes e Métodos de Manipulação de Arquivos de Saída

Para escrevermos informações em um arquivo, devemos criar uma variável do tipo PrintWriter, que será associada ao arquivo que será gravado. Por exemplo, se desejarmos escrever informações no arquivo teste.txt, devemos associar uma variável a este arquivo, como mostrado abaixo:

PrintWriter arquivo = new PrintWriter(new FileWriter("teste.txt"));

Nesta linha, cria-se o arquivo no mesmo diretório do programa. Se o arquivo não existir, cria-se um novo arquivo vazio; entretanto, se o arquivo já existir, então seu conteúdo é apagado e a escrita começa na primeira linha. Se desejarmos ler dados de um arquivo que esteja em outro diretório, basta indicar o caminho como no exemplo abaixo:

PrintWriter arquivo = new PrintWriter(new FileWriter("c:/temp/teste.txt"));

Para escrevermos informações em um arquivo associado a uma variável, podemos utilizar o método println(), que escreve uma nova linha no final do arquivo.

Por exemplo, o código abaixo escreve três linhas no arquivo.

arquivo.println("linha1"); arquivo.println("linha2"); arquivo.println("linha3");

4.2 Um Exemplo Completo

Se quisermos imprimir em arquivo todos os divisores de um número dado pelo usuário, podemos escrever um programa da seguinte forma:

import java.io.*; 

public class Exemplo04 { 

    public static void main(String args[]) throws IOException {

        PrintWriter arquivo = new PrintWriter(new FileWriter("teste.txt"));

        int n = aed1.leInt("Qual é o número?"), cont; 

        for (cont = 1; cont <= n; cont++)

            if (n % cont == 0) arquivo.println(cont);

        } arquivo.close();

    }

}

5 - Um Exemplo Envolvendo Leitura e Escrita de Arquivos

O programa abaixo lê números do arquivo texto.txt e escreve os n´umeros pares no arquivo pares.txt e os ímpares no arquivo impares.txt.

import java.io.*; 

public class Exemplo05 { 

    public static void main(String args[]) throws IOException {

        PrintWriter arquivoPares = new PrintWriter(new FileWriter("pares.txt"));

        PrintWriter arquivoImpares = new PrintWriter(new FileWriter("impares.txt"));

        BufferedReader arquivoEntrada = new BufferedReader(new FileReader("teste.txt"));

        String str = arquivoEntrada.readLine(); 

        int numero; 

        while (str != null) { 

            if(! str.equals("")) { // Se str não for igual à string vazia 

                numero = Integer.parseInt(str); 

                if (numero % 2 == 0)

                    arquivoPares.println(numero);

                else 

                    arquivoImpares.println(numero);

            

            str = arquivoEntrada.readLine();

        }

        arquivoEntrada.close();

        arquivoPares.close();

        arquivoImpares.close();

    }

}

Comentários