Вы находитесь на странице: 1из 16

04/11/2008

Java Avançado

Manipulando Arquivos
Prof. Jucimar Souza
jucibs@gmail.com

Arquivos
 Um dos meios de armazenamento
persitentes;
 Usa o mecanismo de leitura e escrita em
um dispositivo;
 Vamos verificar as formas de ler e gravar
dados em um arquivo utilizando o pacote
java.io

1
04/11/2008

Classe File
A classe File é a classe do Java que
permite ter acesso ‘as informações sobre o
sistema de arquivos. Nome, diretório,
tamanho, permissões de escrita e leitura e
outras coisas mais.

UsoDoFile.java
1. import java.io.File;

2. public class UsoDoFile {


3. public static void main(String[] args) {
4. File arquivo = new File("MeuTexto.txt");
5. System.out.println("Nome: " + arquivo.getName());
6. System.out.println("Caminho: " +
arquivo.getAbsolutePath());
7.
8. System.out.println("Existe? " + arquivo.exists());
9. System.out.println("É um diretório? " +
arquivo.isDirectory());
10. System.out.println("É um arquivo? " + arquivo.isFile());
11. System.out.println("Pode ser lido? " + arquivo.canRead());
12. System.out.println("Pode ser escrito? " +
arquivo.canWrite());
13. }
14. }

2
04/11/2008

Classe File
 A classe File também é uma
representação para arquivos e diretórios
do sistema, trazendo informações
adicionais sobre o sistema operacional,
tais como qual caractere é separador de
diretório, informações sobre disco
disponíveis, etc.

InformacaoSistema.java

import java.io.File;

public class InformacaoSistema {


public static void main(String[] args) {
System.out.println ("Separador de Path: " + File.pathSeparator);
System.out.println ("Separador de Diretório: " + File.separator);

File discos [] = File.listRoots();


for (int cont=0; cont<discos.length; cont++) {
System.out.println ("Disco " + cont + ": " + discos[cont]);
}
}
}

3
04/11/2008

Streams, Readers e Writers


 Em java, arquivos são considerados fonte,
quando realizamos a leitura a partir dele; e
destino, quando realizamos a escrita nele.
 Na leitura, os dados partem da fonte e
trafegam ordenados unidade a unidade até o
programa ou classe java.
 Na gravação, o programa envia os dados
ordenados, unidade a unidade, para um
destino.

Streams, Readers e Writers


 Não é possivel transferir tudo ao mesmo
tempo
 Chamamos este processo de fluxo, ou
Stream.
 Fluxo de entrada - InputStream
 Fluxo de Saida – OutputStream
 Streams normalmente são tratados como
dados representados por números ou bytes,
por isso são chamados de leitura e escrita
binária.

4
04/11/2008

Streams, Readers e Writers


 Existem ainda os arquivos que só
armazenam caracteres, chamados de
arquivos texto
 Java possui leitores e escritores
especiais para o tipo caractere
chamados de :
 FileReader para leitura
 FileWriter para escrita

1.
Leitor.java
import java.io.File;
2. import java.io.FileReader;
3. import java.io.IOException;

4. public class Leitor {


5. public static String ler(File arquivo) {
6. StringBuffer sb = new StringBuffer();
7. try {
8. FileReader reader = new FileReader(arquivo);
9. int c;
10. do {
11. c = reader.read();
12. if (c!=-1) {
13. sb.append( (char)c );
14. }
15. } while (c != -1);
16. reader.close();
17. } catch (IOException e) {
18. e.printStackTrace();
19. }
20. return sb.toString();
21. }
22. }

5
04/11/2008

UsoLeitor.java
1. import java.io.File;

2. public class UsoLeitor {


3. public static void main(String[] args) {
4. File arquivo = new File("MeuTexto.txt");
5. String s = Leitor.ler(arquivo);
6. System.out.println(s);
7. }
8. }

Escritor.java
1. import java.io.File;
2. import java.io.FileWriter;
3. import java.io.IOException;

4. public class Escritor {


5. public static void escreve(File arquivo, String texto) {
6. try {
7. FileWriter writer = new FileWriter(arquivo);
8. char [] c = texto.toCharArray();
9. for (int cont=0; cont<c.length; cont++) {
10. writer.write(c[cont]);
11. }
12. writer.close();
13. } catch (IOException e) {
14. e.printStackTrace();
15. }
16. }
17. }

6
04/11/2008

UsoEscritor.java
1. import java.io.File;

2. public class UsoEscritor {


3. public static void main(String[] args) {
4. File arquivo = new File("Saida.txt");
5. String texto = "Este texto será gravado!\r\nLinha
dois";
6. Escritor.escreve(arquivo, texto);
7. }
8. }

Copiador.java
 import java.io.File;

 public class Copiador {


 public static void main(String[] args) {
 File entrada = new File("MeuTexto.txt");
 File saida = new File("MeuTextoCopiado.txt");
 String s = Leitor.ler(entrada);
 Escritor.escreve(saida, s);
 }

 }

7
04/11/2008

CopiadorBinario.java
1. import java.io.File;
2. import java.io.FileInputStream;
3. import java.io.FileOutputStream;
4. import java.io.IOException;

5. public class CopiadorBinario {


6. public static void copia(File entrada, File saida) {
7. try {
8. FileInputStream input = new FileInputStream(entrada);
9. FileOutputStream output = new FileOutputStream(saida);
10. int c;
11. do {
12. c = input.read();
13. if (c!=-1) {
14. output.write(c);
15. }
16. } while (c != -1);
17. input.close();
18. output.close();
19. } catch (IOException e) {
20. e.printStackTrace();
21. }
22. }
23. }

UsoCopiadorBinario.java
1. import java.io.File;

2. public class UsoCopiadorBinario {


3. public static void main(String[] args) {
4. File entrada = new File("figura.jpg");
5. File saida = new
File("ImagemCopiada.jpg");
6. System.out.println("Iniciando a cópia");
7. CopiadorBinario.copia(entrada, saida);
8. System.out.println("Cópia concluida");
9. }
10. }

8
04/11/2008

Filtros e Buffers
 São objetos intermediários que irão se
encarregar de pegar os dados de uma ponta
e converter, transformar ou armazenar em
estruturas mais complexas.
 Os buffers podem trabalhar com uma linha
inteira. Ou seja, o buffer irá ler os dados
caractere a caractere do disco e converterá
tudo o que foi lido em uma String única e
repassa para o programa.

LeitorBuffer.java
1. import java.io.BufferedReader; import java.io.File;
2. import java.io.FileReader; import java.io.IOException;

3. public class LeitorBuffer {


4. public static String ler(File arquivo) {
5. StringBuffer sb = new StringBuffer();
6. try {
7. FileReader reader = new FileReader(arquivo);
8. BufferedReader bufReader = new BufferedReader(reader);
9. String s;
10. do { s = bufReader.readLine();
11. if (s!=null) {
12. sb.append( s + "\r\n" );
13. }
14. } while (s!=null);
15. bufReader.close();
16. reader.close();
17. } catch (IOException e) {
18. e.printStackTrace();
19. }
20. return sb.toString();
21. }
22. }

9
04/11/2008

EscritorBuffer.java
1. import java.io.BufferedWriter;
2. import java.io.File;
3. import java.io.FileWriter;
4. import java.io.IOException;

5. public class EscritorBuffer {


6. public static void escreve(File arquivo, String texto) {
7. try {
8. FileWriter writer = new FileWriter(arquivo);
9. BufferedWriter bufWriter = new BufferedWriter(writer);
10. bufWriter.write(texto);
11. bufWriter.close();
12. writer.close();
13. } catch (IOException e) {
14. e.printStackTrace();
15. }
16. }
17. }

CopiadorBuffer.java
1. import java.io.File;

2. public class CopiadorBuffer {


3. public static void main(String[] args) {
4. File entrada = new
File("MeuTexto.txt");
5. File saida = new File("MeuTexto2.txt");
6. String s = LeitorBuffer.ler(entrada);
7. EscritorBuffer.escreve(saida, s);
8. }
9. }

10
04/11/2008

Aplicação Gráfica
 Podemos usar o método de leitura de
um arquivo texto e colocarmos o
conteúdo deste arquivo em uma janela
de texto.
 Conforme o exemplo

LeitorSwing.java
1. import java.awt.Container;
2. import java.io.File;
3. import javax.swing.JFrame;
4. import javax.swing.JScrollPane;
5. import javax.swing.JTextArea;

6. public class LeitorSwing {


7. public static void main(String[] args) {
8. JFrame frame = new JFrame(“Curso CEFET/GENIUS");
9. JTextArea textArea = new JTextArea();
10. JScrollPane scrollPane = new JScrollPane(textArea);
11. Container container = frame.getContentPane();
12. container.add(scrollPane);
13. frame.setSize(500, 400);
14. frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
15. frame.setVisible(true);
16.
17. File arquivo = new File("MeuTexto.txt");
18. String s = LeitorBuffer.ler(arquivo);
19. textArea.append ( s );
20. }
21. }

11
04/11/2008

Exercicio
1. Melhorar o exemplo do gráfico para :
Adicionar um JTextField para especificar o arquivo para abrir.
Carregar o arquivo informado no JTextArea
Adicionar um botão para gravar as alterações do Texto.
2. Construa uma classe Contato com os atributos Nome,
Endereco e Telefone. Crie os métodos de gets e sets
para os atributos. Na classe principal faça um array de
Contato efetue a digitação dos contatos. Após a
digitação coloque os dados em um StringTokenizer
usando o $ como delimitador e efetue a gravação no
arquivo agenda.txt
3. Faça outro programa que vai utilizar a classe Contato
criada na questão 2 e faça o processo de leitura da
agenda carregando os dados do disco para o array.
Imprima todos os dados na tela.

Serialização de Objetos
 Serialização de objeto – o mecanismo para ler ou
gravar um objeto inteiro em um arquivo.
 Objeto serializado – o objeto representado como
uma seqüência de bytes, incluindo os dados do
objeto e as informações sobre o objeto.
 Desserialização – recria um objeto na memória a
partir dos dados no arquivo.

12
04/11/2008

Serialização de Objetos (Cont)


 A serialização e a desserialização são
realizadas com as classes
ObjectInputStreams e
ObjectOutputStream, métodos
readObjects e writeObject.

Serialização de Objetos (Cont)


 Interface Serializable – os programadores precisam
declarar uma classe para que possam implementar a
interface Serializable ou os objetos dessa classe não
poderão ser gravados em um arquivo.
 Para abrir um arquivo para gravar objetos, crie um
FileOutputStream empacotado por um
ObjectOutputStream.
 FileOutputStream fornece os métodos para gravar a saída
baseada em bytes em um arquivo.
 ObjectOutputStream utiliza FileOutputStream para gravar
objetos em um arquivo.
 O método writeObject de ObjectOutputStream grava um
objeto no arquivo de saída.
 O método close de ObjectOutputStream fecha os dois objetos.

13
04/11/2008

Classe Caixa.java
import java.io.*;

public class Caixa implements Serializable {

private int altura, largura,profundidade;


Interface Serializable especifica que
public Caixa() { objetos Caixa podem ser gravados em um
} arquivo

public void setAltura(int alt){


altura=alt;
}
public void setLargura(int lar){
largura=lar;
}
...

Classe CaixaSer.java – Serializa o objeto


import java.io.*;
public class CaixaSer {

public static void main(String[] args) {


Caixa caixa1 = new Caixa();
caixa1.setAltura(10);
caixa1.setLargura(20);
caixa1.setProfundidade(30);

try{
FileOutputStream fs=new FileOutputStream("caixa.ser");
ObjectOutputStream os=new ObjectOutputStream(fs);
os.writeObject(caixa1);
os.close();
} catch (Exception ex){
ex.printStackTrace();
}

}
}

14
04/11/2008

Desserialização de Objetos
 Para abrir um arquivo a fim de ler objetos, crie um
FileInputStream empacotado por um
ObjectInputStream.
 FileInputStream fornece os métodos para ler a entrada
baseada em bytes a partir de um arquivo.
 ObjectInputStream utiliza FileInputStream para ler
os objetos em um arquivo.
 O método readObject de ObjectInputStream lê um
objeto, que, então, sofre downcast para o tipo adequado.
 EOFException ocorre se houver uma tentativa de ler depois do final
do arquivo.
 ClassNotFoundException ocorre se a classe para o objeto sendo
lido não puder ser localizada.
 O método close de ObjectInputStream fecha os dois
objetos.

Classe CaixaDes.java – Desserializa o objeto


public class CaixaDes {

public static void main(String[] args) {


// TODO code application logic here
Caixa caixa1;
Object geral;

try{
FileInputStream fs=new FileInputStream("caixa.ser");
ObjectInputStream os=new ObjectInputStream(fs);
geral=os.readObject();

caixa1 = (Caixa) geral;


System.out.printf("Largura: %d \n ",caixa1.getLargura());
System.out.printf("Altura: %d \n ",caixa1.getAltura());
System.out.printf("Profundidade: %d \n ",caixa1.getProfundidade());
os.close();
} catch (Exception ex){
ex.printStackTrace();
}
}
}

15
04/11/2008

Exercicio
 Faça uma alteração no programa para gravar
uma série de objetos Caixa com tamanhos
diferentes.
 Depois faça um programa para deserializar os
objetos caixas armazenados no arquivo e
imprima a largura, altura e profundidade de
cada um. Você pode usar a EOFException
para detectar o fim do arquivo

16