40
Stream – Fluxo I/O Manipulação de arquivos binários Capítulo 10

Capítulo 10. Stream – Fluxo I/O Introdução Principais Exceptions Arquivos binários java.io.InputStream java.io.FileInputStream java.io.ByteArrayInputStream

Embed Size (px)

Citation preview

Page 1: Capítulo 10. Stream – Fluxo I/O  Introdução  Principais Exceptions  Arquivos binários java.io.InputStream java.io.FileInputStream java.io.ByteArrayInputStream

Stream – Fluxo I/OManipulação de arquivos binários

Capítulo 10

Page 2: Capítulo 10. Stream – Fluxo I/O  Introdução  Principais Exceptions  Arquivos binários java.io.InputStream java.io.FileInputStream java.io.ByteArrayInputStream

Stream – Fluxo I/O Introdução Principais Exceptions Arquivos binários

java.io.InputStream java.io.FileInputStream java.io.ByteArrayInputStream java.io.OutputStream java.io.FileOutputStream java.io.ByteArrayOutputStream

Arquivos de acesso randômico

2

Page 3: Capítulo 10. Stream – Fluxo I/O  Introdução  Principais Exceptions  Arquivos binários java.io.InputStream java.io.FileInputStream java.io.ByteArrayInputStream

Introdução O pacote java.io

Contém classes responsáveis pelo acesso e gravação de dados em formato texto ou formato binário “stream” em arquivos ou outras fontes de dados.

As principais categorias de manipuladores são:○ InputStream e Outputstream – Arquivos binários○ Reader e Writer – Arquivos texto

3

Page 4: Capítulo 10. Stream – Fluxo I/O  Introdução  Principais Exceptions  Arquivos binários java.io.InputStream java.io.FileInputStream java.io.ByteArrayInputStream

Principais Exceptions

4

IOExceptiongetMessage() : StringprintStackTrace() : void

FileNotFoundExceptiongetMessage() : StringprintStackTrace() : void

EOFExceptiongetMessage() : StringprintStackTrace() : void

Page 5: Capítulo 10. Stream – Fluxo I/O  Introdução  Principais Exceptions  Arquivos binários java.io.InputStream java.io.FileInputStream java.io.ByteArrayInputStream

Principais Exceptions Principais exceções:

FileNotFoundExceptionOcorre quando a aplicação tenta abrir para leitura um arquivo inexistente

EOFExceptionDisparado pela maioria dos métodos da classe RandomAccessFile quando tenta-se realizar a leitura de bytes após o final do arquivo.

IOExceptionRepresenta qualquer falha ao realizar operações de leitura, escrita ou manipulação de arquivos

5

Page 6: Capítulo 10. Stream – Fluxo I/O  Introdução  Principais Exceptions  Arquivos binários java.io.InputStream java.io.FileInputStream java.io.ByteArrayInputStream

Arquivos binários Arquivos binários são arquivos que contém informações

ilegíveis por editores de texto comuns.

Exemplos de arquivos binários são MP3, JPEGs, AVIs, DOCs, etc.

Nestes arquivos, cada conjunto de 8 bits (1 byte) representa uma informação que não é interpretada como um caractere do alfabeto e precisam de softwares específicos para reconhecer e interpretar o seu formato.

O pacote java.io possui classes utilitárias que permitem a leitura e gravação de bytes provenientes de arquivos e outras fontes de dados binários.

6

Page 7: Capítulo 10. Stream – Fluxo I/O  Introdução  Principais Exceptions  Arquivos binários java.io.InputStream java.io.FileInputStream java.io.ByteArrayInputStream

Arquivos binários

7

[Abstract]InputStream

read() : intread(byte[]) : intread(byte[], int, int) : intskip(long) : longavailable() : intclose() : voidmark(int) : voidmarkSupported() : booleanreset() : void

[Abstract]OutputStream

write(int) : voidwrite(byte[]) : voidwrite(byte[], int, int) : voidflush() : voidclose() : void

FileOutputStream

FileOutputStream(String)FileOutputStream(File)

FileInputStream

FileInputStream(String)FileInputStream(File)

ByteArrayInputStreamByteArrayInputStream(byte[])

ByteArrayOutputStreamtoByteArray() : byte[]

RandomAccessFile

RandomAccessFile(String, String)RandomAccessFile(File, String)readBoolean() : booleanreadByte() : bytereadShort() : shortreadChar() : charreadInt() : intreadLong() : longreadFloat() : floatreadDouble() : doublewriteBoolean(boolean) : voidwriteByte(int) : voidwriteShort(int) : voidwriteChar(int) : voidwriteInt(int) : voidwriteLong(long) : voidwriteFloat(float) : voidwriteDouble(double) : void

Page 8: Capítulo 10. Stream – Fluxo I/O  Introdução  Principais Exceptions  Arquivos binários java.io.InputStream java.io.FileInputStream java.io.ByteArrayInputStream

Arquivos binários java.io.InputStream

Classe abstrata que representa alguma fonte de dados binária.

java.io.OutputStream Classe abstrata que representa

algum destino de dados binários.

java.io.FileInputStream Representa algum arquivo de

onde podemos ler dados byte a byte.

java.io.FileOutputStream Representa algum arquivo onde

podemos armazenar dados byte a byte.

java.io.ByteArrayInputStream Representa um montante de dados em

memória de onde podemos ler dados byte a byte.

java.io.ByteArrayOutputStream Representa um montante de dados em

memória onde podemos armazenar dados byte a byte.

java.io.RandomAccessFile Representa um arquivo binário com

formato pré-definido pelo programador. Útil para armazenamento e leitura de dados de tamanho fixo.

8

Page 9: Capítulo 10. Stream – Fluxo I/O  Introdução  Principais Exceptions  Arquivos binários java.io.InputStream java.io.FileInputStream java.io.ByteArrayInputStream

java.io.InputStream Um InputStream (também chamado de stream de leitura)

representa um montante de informações binárias enfileirados de onde podemos capturar seus dados byte a byte.

Uma instância da classe InputStream possui um posicionador apontando para algum de seus bytes.

A cada leitura realizada o posicionador captura o byte e avança para o próximo, tornando-o disponível para leitura.

9

Ý w ¦ ÿ À ° í Ù i › ¦ Û Y ô ± ê # ø I ? @ ¶ k › $ ð »� ¼ ƒ ‡� ... æ Ø † 3

Page 10: Capítulo 10. Stream – Fluxo I/O  Introdução  Principais Exceptions  Arquivos binários java.io.InputStream java.io.FileInputStream java.io.ByteArrayInputStream

java.io.InputStream int read()

Realiza a leitura do byte da vez retornando um número inteiro entre 0 e 255 e avança para o próximo byte.

Caso o posicionador estiver apontando para depois do último byte, este método retorna o valor -1.

10

Page 11: Capítulo 10. Stream – Fluxo I/O  Introdução  Principais Exceptions  Arquivos binários java.io.InputStream java.io.FileInputStream java.io.ByteArrayInputStream

java.io.InputStreamInputStream input = new FileInputStream(“C:\\foto.jpg”);

byte primeiroByte = (byte) input.read();byte segundoByte = (byte) input.read();byte terceiroByte = (byte) input.read();. . . . . .

11

Ý w ¦ ÿ À ° í Ù i › ¦ Û Y ô ± ê # ø I ? @ ¶ k › $ ð »� ¼ ƒ ‡� ... æ Ø † 3

Alguma implementação de InputStream

Page 12: Capítulo 10. Stream – Fluxo I/O  Introdução  Principais Exceptions  Arquivos binários java.io.InputStream java.io.FileInputStream java.io.ByteArrayInputStream

java.io.InputStreamInputStream input = new ByteArrayInputStream(stream);byte byteDaVez;

/* Exibe todos os bytes, um de cada vez. */while ((byteDaVez = (byte) input.read()) > -1) {

System.out.println(byteDaVez);}

12

Ý w ¦ ÿ À ° í Ù i › ¦ Û Y ô ± ê # ø I ? @ ¶ k › $ ð »� ¼ ƒ ‡� ... æ Ø † 3

Alguma implementação de InputStream

Page 13: Capítulo 10. Stream – Fluxo I/O  Introdução  Principais Exceptions  Arquivos binários java.io.InputStream java.io.FileInputStream java.io.ByteArrayInputStream

java.io.InputStream int read(byte[])

Principal método da classe InputStream.

Realiza a leitura de diversos bytes de uma só vez armazenando-os no array especificado.

Após realizar a leitura este método retorna um número inteiro informando quantos bytes foram realmente lidos.

13

Page 14: Capítulo 10. Stream – Fluxo I/O  Introdução  Principais Exceptions  Arquivos binários java.io.InputStream java.io.FileInputStream java.io.ByteArrayInputStream

java.io.InputStreamInputStream input = new FileInputStream(“C:\\foto.jpg”);byte[] dados = new byte[20];

/* Tenta realizar a leitura dos próximos 20 bytes. */int quant = input.read(dados);

System.out.println(“Foram lidos ” +quant + “ bytes do stream);

14

Ý w ¦ ÿ À ° í Ù i › ¦ Û Y ô ± ê # ø I ? @ ¶ k › $ ð »� ¼ ƒ ‡� ... æ Ø † 3

Page 15: Capítulo 10. Stream – Fluxo I/O  Introdução  Principais Exceptions  Arquivos binários java.io.InputStream java.io.FileInputStream java.io.ByteArrayInputStream

java.io.InputStreamInputStream input = new FileInputStream(“C:\\foto.jpg”);byte[] dados = new byte[1024];int comp;

/* Lê todos os bytes, 1024 por vez. */while ((comp = input.read(dados)) > -1) {

/* Exibe os bytes lidos */for (int i = 0; i < comp; i++) {

System.out.println(dados[i]);}

}

15

Page 16: Capítulo 10. Stream – Fluxo I/O  Introdução  Principais Exceptions  Arquivos binários java.io.InputStream java.io.FileInputStream java.io.ByteArrayInputStream

java.io.InputStream int read(byte[], int, int)

Realiza a leitura de diversos bytes de uma só vez armazenando-os no array especificado e nas posições especificadas.

Após realizar a leitura este método retorna um número inteiro informando quantos bytes foram realmente lidos.

16

Page 17: Capítulo 10. Stream – Fluxo I/O  Introdução  Principais Exceptions  Arquivos binários java.io.InputStream java.io.FileInputStream java.io.ByteArrayInputStream

java.io.InputStream long skip(long)

Avança o posiciondor de leitura sem capturar nenhuma informação do stream.

InputStream input = new FileInputStream(“C:\\plan1.xls”);byte[] stream = new byte[35];

input.read(stream); /* Lê 35 bytes. */input.skip(20); /* “Pula” 20 posições. */input.read(stream); /* Lê mais 35 bytes. */

17

Page 18: Capítulo 10. Stream – Fluxo I/O  Introdução  Principais Exceptions  Arquivos binários java.io.InputStream java.io.FileInputStream java.io.ByteArrayInputStream

java.io.InputStream int available()

Tenta obter a quantidade de bytes disponíveis para leitura de um stream.

Método não confiável em algumas implementações.

InputStream input = new FileInputStream(“C:\\plan1.xls”);int quant = input.available();

System.out.println(“Existem aproximadamente” + quant +“ bytes disponíveis para leitura.”);

18

Page 19: Capítulo 10. Stream – Fluxo I/O  Introdução  Principais Exceptions  Arquivos binários java.io.InputStream java.io.FileInputStream java.io.ByteArrayInputStream

java.io.InputStream void close()

Encerra o stream de entrada liberando o recurso (arquivo ou outra origem de dados) tornando-o disponível para utilização por outros programas do sistema operacional.

Este método deve ser executado sempre que terminarmos a utilização do stream.

InputStream input = new FileInputStream(“C:\\plan1.xls”);. . .. . .input.close();

19

Page 20: Capítulo 10. Stream – Fluxo I/O  Introdução  Principais Exceptions  Arquivos binários java.io.InputStream java.io.FileInputStream java.io.ByteArrayInputStream

java.io.InputStream void reset()

Move o posiciondor de leitura de volta ao início do stream ou até a marca de leitura estabelecida pelo método mark(int).

InputStream input = new FileInputStream(“C:\\plan1.xls”);byte[] stream = new byte[.....];

input.read(stream); /* Lê alguns bytes. */input.reset(); /* Volta o posicionador para o início. */

20

Page 21: Capítulo 10. Stream – Fluxo I/O  Introdução  Principais Exceptions  Arquivos binários java.io.InputStream java.io.FileInputStream java.io.ByteArrayInputStream

java.io.InputStream void mark(int)

Marca a posição atual fazendo com que cada chamada ao método reset() faça o posicionador saltar para ali.

Ao chamar o método mark() devemos especificar a quantidade de bytes que, após lidos, realiza a remarcação automática do posicionador.

Este método não funciona para streams do tipo FileInputStream.

21

Page 22: Capítulo 10. Stream – Fluxo I/O  Introdução  Principais Exceptions  Arquivos binários java.io.InputStream java.io.FileInputStream java.io.ByteArrayInputStream

java.io.InputStream boolean markSupported()

Usado para verificar se o stream possui a funcionalidade do método mark() definido no slide anterior.

22

Page 23: Capítulo 10. Stream – Fluxo I/O  Introdução  Principais Exceptions  Arquivos binários java.io.InputStream java.io.FileInputStream java.io.ByteArrayInputStream

java.io.FileInputStream Uma implementação de InputStream que lê os dados

binários a partir de um arquivo de qualquer formato.

Ao instanciar um FileInputStream devemos especificar o caminho absoluto ou relativo do arquivo desejado.

InputStream input1 = new FileInputStream(“C:\\temp\\foto.jpg”);InputStream input2 = new FileInputStream(“docs\\plan1.xls”);. . .. . .input1.close();input2.close();

23

Page 24: Capítulo 10. Stream – Fluxo I/O  Introdução  Principais Exceptions  Arquivos binários java.io.InputStream java.io.FileInputStream java.io.ByteArrayInputStream

java.io.FileInputStream Uma outra forma de instanciar um FileInputStream é

utilizando alguma instância da classe java.io.File que já tenha sido previamente instanciada:

File file = new File(“C:\\temp\\foto.jpg”);InputStream input = new FileInputStream(file);. . .. . .input.close();

24

Page 25: Capítulo 10. Stream – Fluxo I/O  Introdução  Principais Exceptions  Arquivos binários java.io.InputStream java.io.FileInputStream java.io.ByteArrayInputStream

java.io.ByteArrayInputStream Uma implementação de InputStream que lê os dados

binários a partir de array de bytes.

Útil como argumento de passagem de parâmetros do tipo imagem, som ou outros dados binários para bibliotecas diversas, como:

Armazenamento em bancos de dados; Aplicações de edições de imagens, sons ou outros formatos; Geração dinâmica de relatórios.

byte[] dados = .....; /* Dados binários. */InputStream input = new ByteArrayInputStream(dados);

25

Page 26: Capítulo 10. Stream – Fluxo I/O  Introdução  Principais Exceptions  Arquivos binários java.io.InputStream java.io.FileInputStream java.io.ByteArrayInputStream

java.io.OutputStream Um OutputStream (também chamado de

stream de saída) representa uma entidade ou dispositivo para onde podemos empurrar informações byte a byte.

26

¦ ÿ À °Ý w

Page 27: Capítulo 10. Stream – Fluxo I/O  Introdução  Principais Exceptions  Arquivos binários java.io.InputStream java.io.FileInputStream java.io.ByteArrayInputStream

java.io.OutputStream void write(int)

Converte o valor especificado para byte e adiciona-o ao final do stream.

Em outras palavras, este método “empurra” um byte para o stream de saída.

OutputStream os = new FileOutputStream(“C:\\novo.tmp”);os.write(74);os.write(97);os.write(118);os.write(97);. . .

27

Alguma implementação de OutputStream

Page 28: Capítulo 10. Stream – Fluxo I/O  Introdução  Principais Exceptions  Arquivos binários java.io.InputStream java.io.FileInputStream java.io.ByteArrayInputStream

java.io.OutputStream void write(byte[])

Adiciona um array de bytes ao final do stream.

byte[] conteudo = { 74, 97, 118, 97, 32, 101, 104, 32, 108, 101, 103, 97, 108, 33 };

OutputStream os = new FileOutputStream(“C:\\novo.tmp”);os.write(conteudo);

28

Alguma implementação de OutputStream

Page 29: Capítulo 10. Stream – Fluxo I/O  Introdução  Principais Exceptions  Arquivos binários java.io.InputStream java.io.FileInputStream java.io.ByteArrayInputStream

java.io.OutputStream void write(byte[], int, int)

Adiciona um trecho de array de bytes ao final do stream.

byte[] conteudo = { 74, 97, 118, 97, 32, 101, 104, 32, 108, 101, 103, 97, 108, 33 };

OutputStream os = new FileOutputStream(“C:\\novo.tmp”);os.write(conteudo, 8, 5);

29

Posição inicial Quantidade de bytes

Page 30: Capítulo 10. Stream – Fluxo I/O  Introdução  Principais Exceptions  Arquivos binários java.io.InputStream java.io.FileInputStream java.io.ByteArrayInputStream

java.io.OutputStream void flush()

Algumas implementações de OutputStream utilizam sistema de cache de dados durante a escrita.

O cacheamento consiste em reter em memória parte das informações escritas, despachando-as para seu destino de tempos em tempos.

Em situações como esta, podemos forçar o envio de dados para seu stream de destino através do método flush().

O método flush() obriga o envio de dados em cache para seu destino.

30

Page 31: Capítulo 10. Stream – Fluxo I/O  Introdução  Principais Exceptions  Arquivos binários java.io.InputStream java.io.FileInputStream java.io.ByteArrayInputStream

java.io.OutputStream void close()

Encerra o stream de saída liberando o recurso (arquivo ou outra origem de dados) tornando-o disponível para utilização por outros programas do sistema operacional.

Este método obriga o stream a realizar o flush de todos os dados que porventura ainda estejam em cache.

OutputStream os = new FileOutputStream(“C:\\novo.tmp”);os.write(...);os.write(...);os.write(...);os.close();

31

Page 32: Capítulo 10. Stream – Fluxo I/O  Introdução  Principais Exceptions  Arquivos binários java.io.InputStream java.io.FileInputStream java.io.ByteArrayInputStream

java.io.FileOutputStream Uma implementação de OutputStream que escreve dados

binários em um arquivo sem utilização de cache.

Ao instanciar um FileOutputStream devemos especificar o caminho absoluto ou relativo do arquivo desejado.

Se o arquivo informado já existir, todo o seu conteúdo será sobreposto pelo que está sendo gravado. Se o arquivo ainda não existir, ele tentará ser criado.

OutputStream os = new FileOutputStream(“C:\\temp\\file.tmp”);. . .os.close();

32

Page 33: Capítulo 10. Stream – Fluxo I/O  Introdução  Principais Exceptions  Arquivos binários java.io.InputStream java.io.FileInputStream java.io.ByteArrayInputStream

java.io.FileOutputStream Também podemos utilizar algum File previamente

instanciado para definir o arquivo que será aberto;

File file = new File(“C:\\temp\\file.tmp”);OutputStream os = new FileOutputStream(file);. . .. . .os.close();

33

Page 34: Capítulo 10. Stream – Fluxo I/O  Introdução  Principais Exceptions  Arquivos binários java.io.InputStream java.io.FileInputStream java.io.ByteArrayInputStream

java.io.ByteArrayOutputStream Classe utilitária usada na manipulação de streams e

conversão para arrays de bytes.

Funciona como um stream de saída que retem todos os dados escritos em memória.

Ao final de toda a escrita, podemos converter o stream em um array.

ByteArrayOutputStream os = new ByteArrayOutputStream();os.write(...);os.write(...);. . .byte[] conteudo = os.toByteArray();

34

Page 35: Capítulo 10. Stream – Fluxo I/O  Introdução  Principais Exceptions  Arquivos binários java.io.InputStream java.io.FileInputStream java.io.ByteArrayInputStream

Arquivos de acesso randômico Através da classe java.util.RandomAccessFile

podemos ler e manipular informações em arquivos em formato DAT.

Um arquivo DAT é um arquivo binário utilizado tipicamente para guardar informações de tamanho fixo.

35

� � ...

nome idade salario

funcionario

...nome idade salario

funcionario

nome idade salario

funcionario

Page 36: Capítulo 10. Stream – Fluxo I/O  Introdução  Principais Exceptions  Arquivos binários java.io.InputStream java.io.FileInputStream java.io.ByteArrayInputStream

java.io.RandomAccessFile Ao instanciar um RandomAccessFile, devemos

informar o nome do arquivo e a forma de abrí-lo:

RandomAccessFile dataFile;dataFile = new RandomAccessFile(“C:\\agenda.dat”, “rw”);

Formas de abrir o arquivo:r – Abre o arquivo em modo somente leitura;rw – Abre o arquivo em modo leitura e escrita;rws – Abre o arquivo em modo leitura e escrita garantindo o

sincronismo entre dois ou mais processos que acessem simultaneamente o arquivo.

36

Page 37: Capítulo 10. Stream – Fluxo I/O  Introdução  Principais Exceptions  Arquivos binários java.io.InputStream java.io.FileInputStream java.io.ByteArrayInputStream

java.io.RandomAccessFileGravando dados: void writeInt(int)

Grava um número int ocupando 4 bytes

void writeLong(long)Grava um número long ocupando 8 bytes

void writeFloat(float)Grava um número float ocupando 4 bytes

void writeDouble(double)Grava um número double ocupando 8 bytes

void write(byte[])Grava um conjunto de bytes

void writeBoolean(boolean)Grava um boolean ocupando um byte

void writeByte(int)Converte o número para byte e grava

void writeShort(int)Converte o número para short e grava ocupando 2 bytes

void writeChar(int)Converte o número para char e grava ocupando 4 bytes

37

Page 38: Capítulo 10. Stream – Fluxo I/O  Introdução  Principais Exceptions  Arquivos binários java.io.InputStream java.io.FileInputStream java.io.ByteArrayInputStream

java.io.RandomAccessFileLendo dados: int readInt()

Lê os próximos 4 bytes retornando um int

long readLong()Lê os próximos 8 bytes retornando um long

float readFloat()Lê os próximos 4 bytes retornando um float

double readDouble()Lê os próximos 8 bytes retornando um double

int read(byte[], int, int)Lê um conjunto de bytes carregando-os em um array

boolean readBoolean()Lê o próximo byte retornando um boolean

byte readByte()Lê o próximo byte

short readShort()Lê os próximos 2 bytes retornando um short

char readChar()Lê os próximos 4 bytes retornando um char

38

Page 39: Capítulo 10. Stream – Fluxo I/O  Introdução  Principais Exceptions  Arquivos binários java.io.InputStream java.io.FileInputStream java.io.ByteArrayInputStream

Exercício Crie o pacote br.com.impacta.copy no mesmo projeto do

exercício anterior e copie para este pacote a classe FileCopyFrame fornecida pelo instrutor.

A classe FileCopyFrame é uma classe executável que exibe uma janela permitindo ao usuário digitar o nome de dois arquivos.

39

Page 40: Capítulo 10. Stream – Fluxo I/O  Introdução  Principais Exceptions  Arquivos binários java.io.InputStream java.io.FileInputStream java.io.ByteArrayInputStream

Exercício (Fim) Implemente a funcionalidade do botão Ok da janela

FileCopyFrame (método btnOkActionPerformed(), linha 170).

Ao clicar no botão Ok, a aplicação deverá copiar o arquivo especificado na primeira caixa de texto (txtOrigem) gerando uma cópia com o nome especificado na segunda caixa de texto (txtDestino).

Caso ocorra algum problema durante a cópia, uma mensagem de erro deverá ser exibida ao usuário com o comando JOptionPane.showMessageDialog().

40