16
04/11/2008 1 Java Avançado Manipulando Arquivos Prof. Jucimar Souza [email protected] 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

Java Avançado

Embed Size (px)

DESCRIPTION

Objetivo da aula: Entender como utilizar as interface gráficas do JavaSwingAWTCriação de formulário e inserir componentes visuais nosmesmosProgramação de EventosGerenciamento básico de LayoutUso do NetBeans com a Interface Gráfica

Citation preview

Page 1: Java Avançado

04/11/2008

1

Java Avançado

Manipulando ArquivosProf. Jucimar Souza

[email protected]

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

Page 2: Java Avançado

04/11/2008

2

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.java1. 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. }

Page 3: Java Avançado

04/11/2008

3

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]);}

}}

Page 4: Java Avançado

04/11/2008

4

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.

Page 5: Java Avançado

04/11/2008

5

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

Leitor.java1. 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. }

Page 6: Java Avançado

04/11/2008

6

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.java1. 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. }

Page 7: Java Avançado

04/11/2008

7

UsoEscritor.java1. 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);� }

� }

Page 8: Java Avançado

04/11/2008

8

CopiadorBinario.java1. 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.java1. 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. }

Page 9: Java Avançado

04/11/2008

9

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.java1. 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. }

Page 10: Java Avançado

04/11/2008

10

EscritorBuffer.java1. 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.java1. 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. }

Page 11: Java Avançado

04/11/2008

11

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.java1. 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. }

Page 12: Java Avançado

04/11/2008

12

Exercicio1. Melhorar o exemplo do gráfico para :

Adicionar um JTextField para especificar o arquivo para abrir.Carregar o arquivo informado no JTextAreaAdicionar 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.

Page 13: Java Avançado

04/11/2008

13

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.

Page 14: Java Avançado

04/11/2008

14

Classe Caixa.javaimport java.io.*;

public class Caixa implements Serializable {

private int altura, largura,profundidade;

public Caixa() {}

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

...

Interface Serializable especifica que objetos Caixa podem ser gravados em um

arquivo

Classe CaixaSer.java – Serializa o objetoimport 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();

}

}}

Page 15: Java Avançado

04/11/2008

15

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 objetopublic class CaixaDes {

public static void main(String[] args) {// TODO code application logic hereCaixa 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();

}}

}

Page 16: Java Avançado

04/11/2008

16

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 EOFExceptionpara detectar o fim do arquivo