Vous êtes sur la page 1sur 11

Entrada e Saída em Java

http://www.directnet.com.br/users/rafael.santos

Conceitos Básicos: Entrada e Saída


• Uma das tarefas mais importantes de um
programa: possibilita o reuso dos algoritmos
com dados diferentes
• Exemplo mais comum:
Arquivos
Entrada

Saída

1
Conceitos Básicos: Entrada e Saída
• Abstração: Streams
• Entrada e saída não precisa ser
necessariamente usando um
meio físico local

Entrada

... Saída

Conceitos Básicos: Acesso Seqüencial


• Leitura: • Escrita:

1. Abrir a Stream (criando 1. Abrir a Stream (criando


uma instância de uma uma instância de uma
classe que o classe que o
representa) representa)
2. Ler dados da Stream 2. Escrever dados na
• Se os dados lidos forem Stream enquanto
nulos, chegamos ao final houverem dados a ser
da Stream: terminar escritos
processamento
• Senão processar dados e 3. Fechar Stream
voltar ao passo 2.
3. Fechar Stream

2
Conceitos Básicos: Exceções
• Algo pode dar errado !
• Se a Stream for correspondente a um arquivo
de entrada:
– O arquivo existe? Pode ser lido? Está no formato
esperado?
• Se a Stream for correspondente a um arquivo
de saída:
– O arquivo pode ser criado? Existe espaço no
disco?
• Se a Stream for correspondente a uma
conexão de rede:
– A conexão foi estabelecida corretamente? Os
dados estão no formato esperado?

Conceitos Básicos: Exceções


• Como tratar com estes problemas potenciais:
• Verificando, a cada passo, se a operação deu
certo ?
– if (arquivo aberto)...
– if (dado lido)...
• Verificando se a operação como um todo
pode ser efetuada ?
– Tente abrir o arquivo e ler os dados
– Execute outro trecho de código se houve erro
• Java (e outras linguagens OO): mecanismo
de exceções.

3
Conceitos Básicos: Exceções
• Exceções: falhas no processamento que
podem ser de certa forma, previstas.
• Mecanismo de exceções:
– Se uma exceção ocorrer, uma instância de uma
classe correspondente será criada e o
processamento interrompido.
• Em Java:
– Colocamos o trecho do código que pode causar
uma exceção em um bloco try { }
– Colocamos as exceções que podem ser causadas
em um ou mais blocos
catch(Exceção instância) { }

Exceções: Blocos try/catch


try
{
// Abrimos o arquivo.
// Em um laço "infinito"...
while(true)
{
// Lemos dados do arquivo
// Se houve alguma indicação que os dado não foi lido como
// esperado, possivelmente chegamos no final do arquivo.
if (...) break;
}
// Ao final do laço, fechamos os arquivos.
}
catch (FileNotFoundException fnfe)
{
// Que processamento deverá ser feito se o arquivo não for
// encontrado ?
}
catch (IOException ioe)
{
// Que processamento deverá ser feito se houve um erro qualquer
// de entrada e saída ?
}

4
Conceitos Básicos: Classes para E/S
• Classes de nível mais alto são criadas a partir
de instâncias de classes de nível mais baixo

BufferedReader
(lê Strings de um
InputStreamReader)

BufferedReader InputStreamReader
(lê Strings de um FileReader) (lê caracteres de uma InputStream)

FileReader InputStream
(lê caracteres de um arquivo) (lê bytes de uma Stream)

Conceitos Básicos: Classes para E/S


Entrada Saída
Bytes BufferedInputStream BufferedOutputStream
DataInputStream DataInputStream

Caracteres InputStreamReader OutputStreamWriter

Tipos nativos DataInputStream DataOutputStream

Strings BufferedReader BufferedWriter

Objetos ObjectInputStream ObjectOutputStream

5
Exemplo 1: Escrevendo Strings
BufferedWriter bw;
try
{
bw = new BufferedWriter(new FileWriter("x.txt"));
bw.write("Primeira linha de texto");
bw.newLine();
bw.write("Segunda linha de texto");
bw.newLine();
bw.write("Terceira linha de texto");
bw.newLine();
bw.close();
}
catch (IOException e)
{
System.out.println("Erro na gravação !");
}

Exemplo 2: Lendo Strings


BufferedReader br;
try
{
br = new BufferedReader(new FileReader("Apl2.java"));
String line;
while(true)
{
line = br.readLine();
if (line == null) break;
else System.out.println(line);
}
br.close();
}
catch (FileNotFoundException e)
{
System.out.println("Arquivo não encontrado !");
}
catch (IOException e)
{
System.out.println("Erro na leitura !");
}

6
Exemplo 3: Escrevendo Valores Nativos
DataOutputStream dos;
try
{
dos = new DataOutputStream(new FileOutputStream(“tst.dat"));
dos.writeBoolean(true);
dos.writeInt(123456);
dos.writeFloat(3.1416f);
dos.writeUTF("String");
dos.close();
}
catch (IOException e)
{
System.out.println("Erro na gravação !");
}

Exemplo 4: Lendo Valores Nativos


DataInputStream dis;
try
{
dis = new DataInputStream(new FileInputStream(“tst.dat"));
boolean b = dis.readBoolean();
int i = dis.readInt();
float f = dis.readFloat();
String s = dis.readUTF();
dis.close();
}
catch (FileNotFoundException e)
{
System.out.println("Arquivo não encontrado !");
}
catch (IOException e)
{
System.out.println("Erro na leitura !");
}

7
Entrada e Saída de Instâncias
• Armazenamento de instâncias de classes:
persistência
• Mecanismo “manual”: métodos que
armazenam e recuperam os valores de todos
os campos
• Mecanismo automático: serialização
– Basta declarar que a classe a ser armazenada
implementa a interface Serializable
– Algumas classes de Java não são serializáveis

Exemplo: Uma Classe Serializável


import java.io.Serializable;

public class ContaBancaria implements Serializable


{
private String nomeCorrentista;
private double saldo;

public ContaBancaria(String n,double s)


{
nomeCorrentista = n;
saldo = s;
}

public double getSaldo()


{
return saldo;
}

8
Exemplo: Uma Classe Serializável
public String getNome()
{
return nomeCorrentista;
}

public void deposita(double quantia)


{
saldo = saldo + quantia;
}

public void retira(double quantia)


{
if (quantia < saldo)
saldo = saldo - quantia;
}

Exemplo 5: Escrevendo Instâncias


ObjectOutputStream oos;
ContaBancaria c1 = new ContaBancaria("Sid Sackson",120000);
ContaBancaria c2 = new ContaBancaria("R. C. Bell",900);

try
{
oos =
new ObjectOutputStream(new FileOutputStream("cnt.dat"));
oos.writeObject(c1);
oos.writeObject(c2);
oos.close();
}
catch (IOException e)
{
System.out.println("Erro na gravação !");
}

9
Exemplo 6: Lendo Instâncias
ObjectInputStream ois;
try
{
ois = new ObjectInputStream(new FileInputStream("cnt.dat"));
ContaBancaria ca = (ContaBancaria)ois.readObject();
ContaBancaria cb = (ContaBancaria)ois.readObject();
System.out.println(ca.getNome()+":"+ca.getSaldo());
System.out.println(cb.getNome()+":"+cb.getSaldo());
ois.close();
}
catch (FileNotFoundException e)
{
System.out.println("Arquivo não encontrado !");
}
catch (IOException e)
{
System.out.println("Erro na leitura !");
}
catch (ClassNotFoundException e)
{
System.out.println("Classe para leitura não encontrada !");
}

Programação de Clientes/Servidores
• Estabelecimento de uma conexão cliente-
servidor usando sockets (instâncias da classe
Socket).
• Com a conexão estabelecida, podemos obter
instâncias de InputStream e OutputStream
para fazer a comunicação.
• Com as instâncias de InputStream e
OutputStream podemos fazer envio e
recepção de dados com formatos mais
complexos.

10
Apêndice: Processamento de Tokens
• Token: trecho reconhecível de texto.
• Exemplo: linha de texto Sid Sackson;120000
pode ser “quebrada” usando o caracter ; para
obtermos uma String e um inteiro.
• Aplicações: criação de tabelas simples de
bancos de dados usando arquivos de texto.
• Implementação: a classe StringTokenizer.
– Construtor recebe uma String a ser quebrada e
uma String que contém os separadores.
– Métodos countTokens(), hasMoreTokens() e
nextToken().

Apêndice: Processamento de Tokens


BufferedReader br;
try
{
br = new BufferedReader(new FileReader("dados.txt"));
while(true)
{
String linha = br.readLine();
if (linha == null) break;
StringTokenizer st = new StringTokenizer(linha,";");
String nome = st.nextToken(); // String
float saldo = Float.parseFloat(st.nextToken()); // float
ContaBancaria cb = new ContaBancaria(nome,saldo);
// resto do processamento
}
br.close();
}
catch (IOException e)
{
System.out.println("Erro na gravação !");
}

11

Vous aimerez peut-être aussi