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
- Documentação do classe java.io.File http://download.oracle.com/javase/6/docs/api/java/io/File.html
- Documentação da classe java.io.PrintWriter http://download.oracle.com/javase/6/docs/api/java/io/PrintWriter.html
- Documentação da classe java.io.BufferedReader http://download.oracle.com/javase/6/docs/api/java/io/BufferedReader.html
- Documentação da classe java.io.FileReader http://download.oracle.com/javase/6/docs/api/java/io/FileReader.html
- Documentação da classe java.io.FileWriter http://download.oracle.com/javase/6/docs/api/java/io/FileWriter.html
- Documentação da classe java.lang.String http://download.oracle.com/javase/6/docs/api/java/lang/String.html