Você está na página 1de 10

Programação Orientada a Objetos II Profª Tatiana Pereira Filgueiras

1. Arquivos, Fluxos e Persistência

Programas manipulam dados armazenados em variáveis e coleções na


memória principal. Esses dados são perdidos quando uma variável sai do
escopo ou quando o programa é encerrado.
Para retenção em longo prazo desses dados mesmo após o término do
programa que os criou faz-se a utilização de Arquivos. Esses arquivos são
armazenados em dispositivos de armazenamento secundário como HD's,
DVD’s, CDs etc.
Dados mantidos salvos mesmo após a finalização do programa denominam-
se dados persistentes. Após a criação de um arquivo de dados, a
recuperação de tais dados pode se dar por qualquer estrutura de dados
escolhida pelo programador.
Uma das vantagens da manipulação de arquivos em JAVA é a
independência de plataforma. Isso significa que não importa o sistema
operacional em que o aplicativo esteja rodando, a leitura e escrita de arquivos
são padronizadas. Por se tratar de uma linguagem orientada a objetos, a
utilização de objetos se torna óbvia para estes tipos de operações.
No contexto de entrada e saída de dados, estes são denominados Streams
(fluxos), que podem se originar de um simples arquivo de texto, da entrada de
dados pelo console ou até mesmo a obtenção de dados pela Internet. Se
tratando da questão de armazenamento, objetos podem ser gravados em
arquivo de texto ou arquivos binários. A gravação e releitura de objetos em
arquivos denomina-se Serialização e Desserialização de Objetos.
A. Criação de Arquivos de Texto

O primeiro passo para criar um arquivo é importar o pacote java.io na classe


desejada. Para melhor desempenho do aplicativo é aconselhável saber quais
bibliotecas do pacote serão utilizadas e importá-las uma a uma; porém, neste
exemplo, importaremos o pacote inteiro da seguinte maneira:
import java.io.*;
Após isso, importe os outros pacotes/bibliotecas necessários para seu
projeto e defina sua classe. Como exemplo, vamos definir uma classe
denominada Cria que utiliza o pacote java.io e a biblioteca Scanner:

import java.io.*;
import java.util.Scanner;

public class Cria {


public static void main(String[] args) throws IOException1
{ …}

Para criar um arquivo, primeiramente devemos informar o caminho da pasta


a qual o arquivo pertencerá e o nome do arquivo. Para isso devemos utilizar a
biblioteca File, conforme exemplo abaixo:

File objetoFILE = new File("c:\\teste.txt");


Figura 1. Exemplo de declaração de arquivo no Windows

File objetoFILE = new File("/usr/eu/teste.txt");


Figura 2. Exemplo de declaração de arquivo no GNU/Linux

1
A manipulação de arquivos exige o tratamento de erros do tipo entrada/saída (I/O), por isso é
necessário declarar throws IOException no método main ou utilizar os blocos try e catch.
Como podemos observar, para arquivos do sistema operacional Microsoft
Windows é necessário declarar duas barras ao invés de uma para que a
linguagem compreenda que a barra não se trata de um comando (como por
exemplo, c: \t este.txt, onde \t é comando de tabulação) e sim de uma barra
literal.
Após a definição do arquivo, é necessário verificar se o mesmo já existe e
definir uma ação caso isso ocorra. Para verificar a existência ou não de um
arquivo, utilizamos o método exists()2 da biblioteca File.
Neste exemplo a ação que será tomada é avisar ao usuário que o arquivo
será sobrescrito.

if(objetoFILE.exists())
System.out.println("Arquivo existe e será sobrescrito");

Definidos arquivo a ser criado e tratamento caso o mesmo exista, resta criar
o arquivo. Para isso utilizamos a biblioteca FileWritter da seguinte forma:

FileWriter objetoFileWritter= new FileWriter(objetoFILE);


objetoFileWritter.close();

Com isso criamos o arquivo teste.txt no diretório c: (no caso do Windows).

2
Para mais métodos acesse http://docs.oracle.com/javase/6/docs/api/java/io/File.html
O código completo encontra-se a seguir:
import java.io.*;

public class Cria {

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

File objetoFILE = new File("c:\\teste.txt");


if(objetoFILE.exists())
System.out.println("Arquivo existe e será sobrescrito");

FileWriter objetoFileWritter = new FileWriter(objetoFILE);


objetoFileWritter.close();
}
}
B. Leitura e Escrita de Arquivos de Texto

B.1. Escrita
Além da criação de arquivos, a linguagem JAVA possui classes pré-
definidas que permitem a leitura e escrita nestes arquivos. Partindo do exemplo
em A, vamos supor que desejamos escrever no arquivo teste.txt a tabuada de
um número fornecido pelo usuário. Os passos para isso seriam3:

Definir arquivo;
Verificar se arquivo existe;
Criar Arquivo;
Ler número;
Calcular a tabuada;
Escrever no arquivo;
Fechar arquivo;

As classes para definição e criação de arquivos já foram apresentadas. Vale


ressaltar que a classe FileWriter é usada para abrir um arquivo para escrita
neste. Caso este arquivo não exista ele é criado (recurso utilizado no exemplo
em A). Caso exista, ele é sobrescrito.
Caso desejemos escrever no final de um arquivo já existente sem
sobrescrevê-lo, é necessário “dizer” ao programa que o arquivo já existe. Para
isso utilizamos a seguinte linha de comando:

FileWriter objetoFileWritter= new FileWriter(objetoFILE,true);

Onde true significa que o arquivo já existe e não deve ser sobrescrito.

3
A leitura do número dado pelo usuário pode ser em qualquer instante do programa, mas a ordem
para criação e escrita do arquivo deve seguir rigorosamente a apresentada.
Agora resta escrever no arquivo aberto. Para isso usaremos a classe
PrintWritter. Definimos um objeto do tipo PrintWritter da seguinte maneira:

PrintWriter gravarArq = new PrintWriter(objetoFileWritter);

Para escrever no arquivo utilizamos o método printf 4 da biblioteca. Se


desejarmos pular linha em um arquivo, ao invés de utilizarmos \n devemos
utilizar %n.

gravarArq.printf("+--Resultado--+%n");
for (i=1; i<=10; i++) {
gravarArq.printf("|"+i+" X "+n+" = "+(i*n)+" |%n");
}
gravarArq.printf("+-------------+%n");

Com isso completamos nosso código. Copie e cole o código a seguir em


uma IDE e faça testes modificando o que será escrito no arquivo, tirando o true
do FileWriter e utilizando os demais métodos de escrita disponibilizados no
PrintWritter.

import java.io.*;
import java.util.Scanner;
public class CriaEscreve {
public static void main(String[] args) throws IOException {
int i,n;
Scanner ler = new Scanner(System.in);
File objetoFILE = new File("c:\\teste.txt");
if(arquivo.exists())
System.out.println("Arquivo existe e será sobrescrito");
FileWriter objetoFileWriter = new FileWriter(objetoFILE,true);
System.out.printf("Informe o número para a tabuada:\n");
n = ler.nextInt();
PrintWriter gravarArq = new PrintWriter(objetoFileWriter);
gravarArq.printf("+--Resultado--+%n");

4
Para mais métodos acesse:
http://docs.oracle.com/javase/7/docs/api/java/io/PrintWriter.html
for (i=1; i<=10; i++) {
gravarArq.printf("|"+i+" X "+n+" = "+(i*n)+" |%n");
}
gravarArq.printf("+-------------+%n");
objetoFileWriter.close();
}
}

B.2 Leitura

A leitura de arquivos de texto na linguagem JAVA é feita linha a linha


utilizando FileReader e BufferedReader. A classe FileReader nos fornece
métodos para abrir arquivos para leitura, enquanto que a classe
BufferedReader é utilizada para ler o arquivo aberto.
Supondo que se deseje ler o arquivo criado em B.1. .A ordem para leitura
seria:

Definir arquivo;
Verificar se arquivo existe;
Abrir Arquivo;
Definir leitor do arquivo;
Ler o arquivo linha a linha;
Fechar arquivo;

A definição do arquivo a ser lido é definida da seguinte maneira:

FileReader abreArq = new FileReader(objetoFILE);

Enquanto que o leitor do arquivo é definido a seguir:

BufferedReader lerArq = new BufferedReader(abreArq);


Após definir o arquivo a ser lido e abri-lo para leitura, devemos ler cada linha
do arquivo utilizando métodos disponíveis na classe BufferedReader. O código
a seguir mostra uma das maneiras de se fazer isto:

String linha = lerArq.readLine(); // lê a primeira linha


/* a variável String linha recebe o valor "null" quando o
processo de repetição atingir o final do arquivo texto */

while (linha != null) { //enquanto houver linhas


System.out.printf(linha+”\n”); //imprima seu conteúdo
linha = lerArq.readLine();//vá para a próxima linha
}
abreArq.close(); //fechar arquivo

Com isso será impresso o que estiver contido no arquivo. O código completo
para leitura encontra-se a seguir:

import java.io.*;

public class LerArquivo {

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

File objetoFILE = new File("c:\\teste.txt");

FileReader abreArq = new FileReader(objetoFILE);

BufferedReader lerArq = new BufferedReader(abreArq);

String linha = lerArq.readLine();

while (linha != null) {


System.out.printf(linha+"\n");
linha = lerArq.readLine();
}

abreArq.close();
}
}
2. Exercícios de Fixação

1. Implemente uma classe que crie um arquivo de texto denominado


“jogos.txt”, contendo as seguintes linhas:

Brasil#x#Argentina#:#3#x#0
Coreia#x#Japao#:#1#x#2
Alemanha#x#Peru#:#1#x#0
EUA#x#Espanha#:#2#x#2
Africa#x#Mexico#:#1#x#2

2. Crie um programa que leia e imprima na tela o conteúdo do arquivo


“jogos.txt”

3. Utilizando a biblioteca StringTokenizer, modifique a classe criada no


exercício anterior de tal forma que a mesma imprima o conteúdo do
arquivo sem os caracteres ‘#’ e de forma tabulada. Por exemplo:
Brasil x Argentina : 3 x 0

4. Copie e cole o código abaixo na IDE de sua preferência e execute-o.


O que este programa faz?
import java.io.*;
import java.util.Date;
public class ProgramaTeste {
public static void main(String[] args) throws IOException {
File arquivo = new File("c:\\"); //diretorio Windows
File fList[] = arquivo.listFiles();
System.out.println("Encontrados : " + fList.length );
for ( int i = 0; i < fList.length; i++ ){
System.out.println(fList[i].getName()+" "+new
Date(fList[i].lastModified()));
}//for
}//main
}//class
5. Crie uma agenda simples em que o programa solicite ao usuário
nome e telefone, estes sejam lidos do teclado e salvos em um arquivo
denominado “contatos.txt”. Cada novo contato deve ser inserido na
linha seguinte ao contato anterior, ou seja, o arquivo não deve ser
sobrescrito. Dica: para separar nome e telefone, utilize um
delimitador (por exemplo, Maria#32061234).

6. Utilizando o comando switch (ou outro de sua preferência), modifique


a agenda de forma que o programa questione o usuário se o mesmo
deseja ver os contatos (ler do arquivo) ou inserir um novo contato
(escrever no arquivo). Cada uma destas opções deve estar
implementada em uma classe distinta, portanto, a classe principal
deve instanciar um objeto conforme a escolha do usuário.

7. Crie um programa para um departamento de RH que utiliza a lista de


contatos criada no exercício 6. O programa deve recuperar nome e
telefone do contato, mostrá-lo em tela e solicitar outras informações
como nível de escolaridade, cargo e salário pretendido. Estas
informações deverão ser inseridas pelo usuário, via teclado. Após
isso, o programa deve criar um novo arquivo de texto e salvar nome,
telefone, nível de escolaridade, cargo e salário do contato.

8. [Desafio: 0.5pt na média de A1] Modifique o programa criado em 7


de forma que o usuário possa deletar um contato do arquivo sem
afetar os demais contatos. O programa deve ainda, criar um backup
do arquivo original e salva-lo em uma pasta denominada bkps. Esta
pasta deve ser criada pelo programa no momento da solicitação de
remoção de um contato.

Os exercícios podem ser feitos em dupla e entregues à professora via moodle.


Estes exercícios complementarão o conceito final de A1.

Você também pode gostar