Manipulando Arquivo Txt com Java

Neste artigo utilizaremos as classes do pacote java.io para criação de diretórios e arquivos do tipo txt. Também veremos como escrever e ler os arquivos criados com o java.io, e outras funções disponíveis neste pacote. Por fim, vamos criar um layout simples de arquivo txt para armazenar informações de objetos Java.

1. Criando diretórios e arquivos

Para a criação de diretórios e arquivos em Java, podemos utilizar a classe java.io.File, vamos agora ver como isso pode ser feito.

Para criar um diretório devemos primeiro criar uma instância da classe File para criar um objeto File. Em seu construtor passamos o local e o nome do diretório que será criado.

java.io.File diretorio = new java.io.File("C:\\TutorialArquivos"); 

Depois de criado o objeto e inserido o local e o nome do diretório, vamos então utilizar o método mkdir() do objeto File criado. É nesse momento que o diretório será criado. Este método retorna um valor true ou false para indicar se o diretório foi criado ou não.

boolean statusDir = file.mkdir();
System.out.print(statusDir); 

Temos agora um novo diretório, vamos então criar nosso primeiro arquivo neste diretório. Para isso, criamos uma nova instância de File e no construtor parssaremos em qual diretório vamos criá-lo e qual será o nome do arquivo.

java.io.File arquivo = new java.io.File(diretorio, "arq_01.txt"); 

Feito o passo anterior, precisamos utilizar então o método createNewFile() para criar fisicamente o arquivo. Porém este método possui em sua assinatura a exigência de uma exceção do tipo java.io.IOException, que devemos utilizá-la. O método também possui um retorno do tipo boleano.

try {
	boolean statusArq = arquivo.createNewFile();
	System.out.print(statusArq);
} catch (IOException e) {
    e.printStackTrace(); 
} 

Agora está tudo criado, diretório e arquivo. Pode conferir no diretório C:\\ .

2. Usando outros métodos da classe File

Vamos conhecer outros métodos da classe java.io.File.

Primeiro vamos usar o método exists() , que retorna se um arquivo ou diretório existe em um determinado local. O uso é simples e nos retorna um valor boleano. Para utilizá-lo, devemos criar um objeto File e no construtor indicar o nome e/ou local do que procuramos.

Vamos testar se nosso diretório criado existe, e se existir, vamos então testar se nosso arquivo criado existe. Para não criar dois novos objetos, vamos utilizar os dois objetos criados na sessão 1.

if (dir.exists()) {
	System.out.println("Diretório existe!");
    if (arq.exists()) {
    	System.out.println("Arquivo existe!");
    }
}

Outro método que podemos utilizar é o listFiles() , ele nos retorna uma lista com todos arquivos e diretórios de um determinado diretório. Devemos também criar um objeto File e indicar no construtor em qual local vamos fazer a pesquisa, neste exemplo vamos pesquisar no diretório C:\\ .

File files = new File("C:\\");
for (File file : files.listFiles()) {
	System.out.println(file);
}

Vamos utilizar o método renameTo() para renomear um arquivo e um diretório. Precisamos criar um novo objeto para indicar o novo nome do arquivo. Vamos utilizar o diretório e o arquivo anteriormente criados para este exemplo.

File dir = new File("C:\\TutorialArquivos");
File arq = new File(dir, "arq_01.txt");
File arq2 = new File(dir, "arq_02.txt");
boolean statusRename = arq.renameTo(arq2);
System.out.println("Renomedo: " + statusRename + " -> New name: " + arq);

Veja que fizemos a chamada ao método renameTo() através do objeto antigo arq . Criamos um novo objeto chamado arq2, onde indicamos o novo nome do arquivo. Passamos então o objeto arq2 como parâmetro no método renameTo(arq2) .

Podemos também testar se um arquivo encontrado é do tipo diretório ou arquivo. Antes iremos criar mais alguns arquivos e diretórios dentro do nosso diretório C:\\TutorialArquivos . Vamos também utilizar o método getName() para ter como retorno o nome do arquivo encontrado. Veja no exemplo abaixo.

File dir = new File("C:\\TutorialArquivos");

File dir2 = new File(dir + "\\DiretorioDois");
dir2.mkdirs();

File dir3 = new File(dir + "\\DiretorioTres");
dir3.mkdir();

File arq3 = new File(dir, "arq_03.txt");
try {
	arq3.createNewFile();
} catch (IOException e) {
    e.printStackTrace();
}

for ( File f : dir.listFiles() ) {
    if ( f.isDirectory() ) {
    	System.out.println(f + " é um diretório.");
    } else if (f.isFile()) {
    	System.out.println(f.getName() + " é um arquivo.");
    }
}

Por fim vamos utilizar o método delete() no próximo exemplo, e excluir o arquivo e o diretório que foram criados anteriormente.

System.out.println( dir3.delete() );
System.out.println( arq3.delete() );

Existem vários outros métodos na classe java.io.File além dos citados aqui, veja você mesmo e qualquer dúvida leia a documentação dos mesmos.

3. Escrevendo em arquivo TXT

Chegou a hora de aprendermos a escrever nos arquivos criados, para isso, vamos utilizar a classe java.io. PrintWriter . Existem varias classes no pacote java.io que possibilitam a escrita em arquivos, porém eu considero a PrintWriter a mais interessante delas pelos métodos que ela oferece.

Desta vez vamos criar uma classe chamada User e nela criar algumas variáveis de instância, conforme a listagem abaixo.

import java.util.Date;

public class User {
    private Integer id;
    private String nome;
    private String observacao;

    public User() {
    }

    public User(Integer id, String nome, String observacao) {
        this.id = id;
        this.nome = nome;
        this.observacao = observacao;
    }
	//Gere os métodos getters e setters
	//Subscreva o método toString()   
}

Crie agora outra classe, chamada FileTestUser, nela iremos criar um método main() e um método para escrever no arquivo que ainda criaremos.

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;

public class FileTestUser {
    public static void main(String[] args) {
        //criando um objeto User
        User user = new User();
        user.setId(1);
        user.setNome("Bart Simpson");
        user.setObservacao("Personagem de desenho animado.");

        //Chamando o método escrever e passando user como parâmetro
        escrever(user);

    }

    private static void escrever(User user) {
        File dir = new File("C:\\TutorialArquivos");
        File arq = new File(dir, "User.txt");

        try {

            //neste ponto criamos o arquivo fisicamente
            arq.createNewFile();

            //Devemos passar no construtor do FileWriter qual arquivo
            // vamos manipular.
            // Esse construtor aceita dois tipos de parâmetros,
            // File ou String.
            //O parâmetro true indica que reescrevemos no arquivo
            // sem apagar o que já existe.
            // O false apagaria o conteúdo do arquivo e escreveria
            // o novo conteúdo.
            // Se não usar o 2° parâmetro, ele por padrão será false.
            //O mais importante, essa linha abre o fluxo do arquivo 
            FileWriter fileWriter = new FileWriter(arq, false);

            //Agora vamos usar a classe PrintWriter para escrever
            //fisicamente no arquivo.
            //Precisamos passar o objeto FileReader em seu construtor
            PrintWriter printWriter = new PrintWriter(fileWriter);

            //Agora vamos escrever no arquivo com o método  println(),
            // que nos permite escrever linha a linha no arquivo
            printWriter.println(user.getId());
            printWriter.println(user.getNome());
            printWriter.println(user.getObservacao());

            //o método flush libera a escrita no arquivo
            printWriter.flush();

            //No final precisamos fechar o arquivo
            printWriter.close();

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

    }
}

A classe PrintWriter ainda nos fornece outros dois métodos para escrita, o write() e o append(). A diferença deles para o método println() é que o último escreve linha a linha conforme é chamado, já os anteriores irão adicionando as palavras sempre na mesma linha.

Há também uma diferença entre o método write() e append(), o primeiro não aceita null, já o segundo aceita null. Existem ainda os métodos printf(), print() e format() e eles funcionam de maneira semelhante como quando os utilizamos em um System.out.print() , System.out.printf() ou System.out.format() respectivamente.

4. Lendo um arquivo TXT

Para ler o arquivo User.txt, vamos primeiro importar as classes java.io.FileReader e java.io.BufferedReader. Em seguida vamos criar o método ler().

private static void ler() {
	File dir = new File("C:\\TutorialArquivos");
    File arq = new File(dir, "User.txt");

    try {
        //Indicamos o arquivo que será lido
        FileReader fileReader = new FileReader(arq);

        //Criamos o objeto bufferReader que nos
        // oferece o método de leitura readLine()
        BufferedReader bufferedReader = new BufferedReader(fileReader);

        //String que irá receber cada linha do arquivo
        String linha = "";

        //Fazemos um loop linha a linha no arquivo,
        // enquanto ele seja diferente de null.
        //O método readLine() devolve a linha na
        // posicao do loop para a variavel linha.
        while ( ( linha = bufferedReader.readLine() ) != null) {
        //Aqui imprimimos a linha
        System.out.println(linha);
    }
		//liberamos o fluxo dos objetos ou fechamos o arquivo
        fileReader.close();
        bufferedReader.close();
	} catch (IOException e) {
    	e.printStackTrace();
    }
}

Caso você deseje recuperar os dados do arquivo para o objeto User, deverá criar um layout para o arquivo. Salvar as informações na mesma linha seria o mais aconselhável caso o mesmo arquivo guarde mais de um User.

Esse layout pode ser por posições, tipo o id vai da posição 0 à 5, o nome da posição 6 à 26, e assim por diante. Outro modo seria ao invés de guardar posições, criar um carácter que determine que o campo id terminasse quando encontrasse esse carácter e está começando o campo nome, poderia ser, por exemplo, um ponto e vírgula, ou qualquer outro carácter que você tem certeza que não seria usado naquele objeto.

5. Usando um layout simples

Vamos agora criar uma nova classe chamada TestLayout. Vamos criar vários users e depois inserir em um arquivo, onde usaremos o “;” para separar os atributos de cada user . E cada nova linha do arquivo conterá um novo user .

import java.util.*;
import java.io.*;
import java.util.ArrayList;

public class FileTestUser {
    public static void main(String[] args) {
        //Criamos 6 users
        User user1 = new User(1, "Ronaldinho Gaúcho", "Jogador de Futebol");
        User user2 = new User(2, "Nelson Piquet", "Piloto de Fómula 1");
        User user3 = new User(3, "Monteiro Lobato", "Escritor");
        User user4 = new User(4, "Luana Piovani", "Atriz");
        User user5 = new User(5, "Ana Maria Braga", "Apresentadora de Televisão");
        User user6 = new User(6, "João Carlos", "Programador JEE");
        //adicionamos os users em um lista
        List userList = new ArrayList();
        userList.add(user1);
        userList.add(user2);
        userList.add(user3);
        userList.add(user4);
        userList.add(user5);
        userList.add(user6);
        //passamos a lista por parâmetro
        layout(userList);
    }

    private static void layout(List users) {
        File dir = new File("C:\\TutorialArquivos");
        //Cria um novo arquivo
        File arq = new File(dir, "User2.txt");

        try {
            arq.createNewFile();
            FileWriter fileWriter = new FileWriter(arq, false);
            PrintWriter printWriter = new PrintWriter(fileWriter);
            //Utilizamos o método print() para escrever na
            // mesma linha e um ponto e vírgula no final.
            //O println forçará a troca de linha
            // para o próximo user.
            for (User user : users) {
                printWriter.print(user.getId() + ";");
                printWriter.print(user.getNome() + ";");
                printWriter.println(user.getObservacao());
            }
            printWriter.flush();
            printWriter.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
            FileReader fileReader = new FileReader(arq);
            BufferedReader bufferedReader = new BufferedReader(fileReader);
            String linha = "";

            //Lista que irá guardar o resultado, ou seja,
            // cada linha do arquivo que corresponde a um User
            List result = new ArrayList();

            while ((linha = bufferedReader.readLine()) != null) {
                System.out.println(linha);
                if (linha != null && !linha.isEmpty()) {
                    result.add(linha);
                }
            }
            fileReader.close();
            bufferedReader.close();

            for (String s : result) {
                //Usamos o método split da classe String
                // para separar as partes entre os ponto e vírgulas.
                //Guardamos o resultado em um array
                String[] user = s.split(";");

                //Criamos um objeto User e setamos em seus atributos
                //as posições correspondentes do array
                User u = new User();
                u.setId(Integer.valueOf(user[0]));
                u.setNome(user[1]);
                u.setObservacao(user[2]);

                //exibe o conteúdo do objeto u
                System.out.println(u.toString());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

Conclusão

Neste artigo vimos como utilizar alguns métodos importantes do pacote java.io . Aprendemos a criar, excluir e renomear arquivos e diretórios, entre outros métodos da classe File . Também aprendemos a escrever em arquivos e como ler os mesmos, e por fim, um pequeno exemplo para trabalhar com arquivo no estilo layout . Fica como dica a criação do seu próprio layout de arquivo.

Saiba mais

Ballem

Marcio Ballem é bacharel em Sistemas de Informação pelo Centro Universitário Franciscano em Santa Maria/RS. Tem experiência com desenvolvimento Delphi e Java em projetos para gestão pública e acadêmica. Possui certificação em Java, OCJP 6.

Você pode gostar...