java 05

13
1 Curso Superior de Tecnologia em Telemática Programação Orientada a Objetos Streams em Java Copyright©2010 Prof. César Rocha

Upload: samuelthiago

Post on 20-May-2015

747 views

Category:

Technology


2 download

TRANSCRIPT

1

Curso Superior de Tecnologia em TelemáticaProgramação Orientada a Objetos

Streams em Java

Copyright©2010Prof. César Rocha

2

Objetivos

§ Explorar os conceitos fundamentais acerca do uso de streamsstreams de arquivos em Java§ Principais classes, abrindo conexões de streams, leitura e

gravação de objetos com streams, serialização e boas práticas de programação.

§ Como trocar dados com outros programas não-Java§ Leitura e gravação de texto e caracteres com streams

§ Exercícios e vários exemplos de códigos que você deve testar visando solidificar seus conhecimentos§ A diversidade de novas classes neste módulo é grande!

3

Motivação

§ Vimos que uma aplicação Java possui diversos objetos cooperantes com estado e comportamento§ Cada objeto é único e possui seus próprios dados

§ O quê fazer quando precisamos salvar todo o estado de um (ou mais) objeto(s) no disco?§ Aplicação bancária, onde todos os objetos Transação

devem ser gravados em um arquivo de lote diário§ Um Jogo de computador, onde o estado atual de um

Personagem deve ser gravado para uma sessão futura

§ E quando a aplicação deve trocar informações com outros sistemas (muitas vezes não-OO)?

4

Alternativas

§ Em Java, basicamente, há dois formatos possíveis para gravar dados em arquivos, conforme a seguir:� Serialização: um arquivo irá guardar uma fila de objetos

serializados. O conteúdo deste arquivo é quase ilegível, mas natural à JVM. Quando há necessidade de recuperar o objeto a partir do arquivo, ele é “inflado” e enviado para a memória, automaticamente� Texto/Caracteres: um arquivo irá guardar uma cadeia

de caracteres. Neste processo, o programador cria seu formato pessoal de armazenamento e pode compreendê-lo. Usa-se, geralmente, algum delimitador para materializar este formato

5

Passos para gravar objetos

§ Seguem os passos básicos necessários para escrever(enviar) um objeto para um arquivo no disco:� Criar um FileOutputStream:FileOutputStream fos = new

FileOutputStream(“arquivo.ser”);� Criar um ObjectOutputStream:

ObjectOutputStream oos = newObjectOutputStream(fos);

� Gravar o objeto:Cliente c1 = new Cliente();oos.writeObject(c1);� Fechar a conexão:oos.close();

Note a concatenação. Note a concatenação.

Dica:Dica: se se arquivo.ser não existir não existir no disco, ele será criado. no disco, ele será criado.

Dica:Dica: se se arquivo.ser não existir não existir no disco, ele será criado. no disco, ele será criado.

6

Interface Serializable

§ Se sua classe precisa ser serializada, implemente a interface Serializable (marker interface)

public class Cliente implements Serializable {private String nome;private double salario;public Cliente(){...}public String getNome(){…}public void setNome(String n){…}public double getSalario(){…}public void setSalario(double s){…}public String toString(){…}

public class Cliente implements Serializable {private String nome;private double salario;public Cliente(){...}public String getNome(){…}public void setNome(String n){…}public double getSalario(){…}public void setSalario(double s){…}public String toString(){…}

import java.io.FileOutputStream;import java.io.IOException;import java.io.ObjectOutputStream;

public class GravaCliente {public static void main( String[] args ) {

Cliente c = new Cliente();try {FileOutputStream fos = new FileOutputStream("arquivo.ser");ObjectOutputStream oos = new ObjectOutputStream(fos);oos.writeObject(c);oos.close();

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

}

import java.io.FileOutputStream;import java.io.IOException;import java.io.ObjectOutputStream;

public class GravaCliente {public static void main( String[] args ) {

Cliente c = new Cliente();try {FileOutputStream fos = new FileOutputStream("arquivo.ser");ObjectOutputStream oos = new ObjectOutputStream(fos);oos.writeObject(c);oos.close();

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

}

Dica:Dica: estes valores serão salvos estes valores serão salvos em em arquivo.ser

7

Importante

§ E o que acontece quando o objeto possui variáveismembros do tipo referência (outros objetos)?§ Quando um objeto é serializado, toda a árvore (hierarquia)

que forma o objeto principal é serializadaautomaticamente§ Porém, os objetos membros também devem ser

serializáveis, caso contrário uma exceção do tipoNotSerializableException será gerada.

§ E o que acontece quando não temos acesso a classemembro para corrigir (alterar o código)?§ Podemos usar a herança de implementação (extends)

8

Passos para restaurar/ler objetos

§ Seguem os passos básicos necessários para ler (restaurar) um objeto a partir de um arquivo:� Criar um FileInputStream:

FileInputStream fis = newFileInputStream(“arquivo.ser”);

� Criar um ObjectInputStream:ObjectInputStream ois = new

ObjectInputStream(fis);

� Ler o objeto:Cliente novo = (Cliente) ois.readObject();

� Fechar a conexão:ois.close();

Note a concatenação. Note a concatenação.

Dica:Dica: os objetos devem ser lidos os objetos devem ser lidos na mesma ordem em que foram na mesma ordem em que foram gravados anteriormente (fila). gravados anteriormente (fila).

9

Passos para gravar caracteres

§ Seguem os passos básicos necessários para escrever(enviar) um texto para um arquivo no disco:� Criar um FileWriterFileWriter fw = new

FileWriter(“arquivo.txt”);� Concatená-lo com um BufferedWriter:BufferedWriter bw = new

BufferedWriter(fw);� Gravar o texto:bw.write(“Um texto”);� Fechar a conexão:bw.close();

Dica:Dica: O controle (separadores) O controle (separadores) deve ser feito pelo programador deve ser feito pelo programador

10

Exemplo

§§ LembreLembre--se:se: o controle sobre toda a formatação do arquivo (separadores, quebras de linha, etc) é tarefa do programador do sistema

import java.io.BufferedWriter;import java.io.FileWriter;import java.io.IOException;

public class GravaTexto {public static void main( String[] args ) {

try {FileWriter fw = new FileWriter("compras.txt");BufferedWriter bw = new BufferedWriter(fw);bw.write("100"); bw.write(“#"); bw.write("Feijão"); bw.write("\n");bw.write("200"); bw.write(“#"); bw.write("Arroz"); bw.write("\n");bw.close();

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

}

import java.io.BufferedWriter;import java.io.FileWriter;import java.io.IOException;

public class GravaTexto {public static void main( String[] args ) {

try {FileWriter fw = new FileWriter("compras.txt");BufferedWriter bw = new BufferedWriter(fw);bw.write("100"); bw.write(“#"); bw.write("Feijão"); bw.write("\n");bw.write("200"); bw.write(“#"); bw.write("Arroz"); bw.write("\n");bw.close();

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

}

11

Passos para ler caracteres

§ Seguem os passos básicos necessários para ler(restaurar) um texto a partir de um arquivo:� Criar um FileReaderFileReader fr = new

FileReader(“arquivo.txt”);� Concatená-lo com um BufferedReader:BufferedReader br = new

BufferedReader(fr);� Lê o texto:String s = br.readLine();� Fechar a conexão:br.close();

Dica:Dica: quando não houver mais quando não houver mais linhas, linhas, readLinereadLine() retornará () retornará null

12

Exemplo

§ O quê fazer para extrair os dados em cima de cada umadas linhas presentes no arquivo?§ Use o método split() ou a classe StringTokenizer

import java.io.BufferedReader;import java.io.FileReader;import java.io.IOException;public class LeTexto {

public static void main( String[] args ) {try {

FileReader fr = new FileReader("compras.txt");BufferedReader br = new BufferedReader(fr);String linha = null;while ( (linha = br.readLine()) != null ) {

String[] v = linha.split("#");for ( String dado : v ) System.out.println(dado);

}br.close();

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

}

import java.io.BufferedReader;import java.io.FileReader;import java.io.IOException;public class LeTexto {

public static void main( String[] args ) {try {

FileReader fr = new FileReader("compras.txt");BufferedReader br = new BufferedReader(fr);String linha = null;while ( (linha = br.readLine()) != null ) {

String[] v = linha.split("#");for ( String dado : v ) System.out.println(dado);

}br.close();

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

}

13

Para um bom aproveitamento:Para um bom aproveitamento:

§ Codifique os exemplos mostrados nestes slides e verifique pontos de dúvidas§ Resolva todas as questões da lista de lista de streamsstreams§ Procure o professor ou monitor da disciplina e questione

conceitos, listas, etc.§ Não deixe para codificar tudo e acumular assunto para

a avaliação.§ Este é apenas um dos assuntos abordados na prova!