Programao de computadores II Professor Anselmo Montenegro www

  • Slides: 42
Download presentation
Programação de computadores II Professor: Anselmo Montenegro www. ic. uff. br/~anselmo Conteúdo: - Manipulação

Programação de computadores II Professor: Anselmo Montenegro www. ic. uff. br/~anselmo Conteúdo: - Manipulação de arquivos em Java Instituto de Computação - UFF 1

Conceitos sobre arquivos (1/11) • Todo sistema computacional de alguma forma, armazena e manipula

Conceitos sobre arquivos (1/11) • Todo sistema computacional de alguma forma, armazena e manipula informações • O conceito de informação inclui diversas noções tais como conhecimento, dados, padrões, representação, comunicação, significado, etc • Uma noção muito importante diz respeito à representação de entidades (concretas ou abstratas) segundo suas propriedades Instituto de Computação - UFF 2

Conceitos sobre arquivos (2/11) • Uma entidade é algo que pode ser identificável segundo

Conceitos sobre arquivos (2/11) • Uma entidade é algo que pode ser identificável segundo um conjunto de características Exemplo: Um aluno, um produto, um empregado, etc • Um conjunto de entidades com características comuns forma uma classe de entidades Exemplo: Itens de um supermercado, alunos de uma turma, automóveis, etc Instituto de Computação - UFF 3

Conceitos sobre arquivos (3/11) • Uma entidade é caracterizada por um conjunto de atributos

Conceitos sobre arquivos (3/11) • Uma entidade é caracterizada por um conjunto de atributos que tomam valores pertencentes a um dado domínio • Um conjunto de pares <atributo, valor> determina um registro • Exemplo: Atributos: Nome matricula curso CR Valores: Pedro 1123907 comp 8. 9 Instituto de Computação - UFF 4

Conceitos sobre arquivos (4/11) • Um conjunto de registros armazenados em memória principal é

Conceitos sobre arquivos (4/11) • Um conjunto de registros armazenados em memória principal é denominado tabela, e quando armazenado em memória secundária é denominado arquivo. Cristiano Prog Comp I A 1 11013102 8. 0 Dante Prog Comp I B 1 11023506 7. 1 Esteban Prog Comp I C 1 12340718 2. 1 Anselmo Prog Comp II A 1 25314080 3. 0 Isabel Prog Comp II B 1 13485710 9. 0 Dante Prog Comp II C 1 Ferraz Estruturas de Dados I A 1 Isabel Estruturas de Dados I B 1 Cristina Estruturas de Dados I C 1 Instituto de Computação - UFF 5

Conceitos sobre arquivos (5/11) • É necessário especificar um esquema para que os algoritmos

Conceitos sobre arquivos (5/11) • É necessário especificar um esquema para que os algoritmos possam acessar registros sem a necessidade de passar todos os valores associados atributos. • Isto pode ser feito através de um subconjunto de atributos denominado chave. • Uma chave destaca um único registro (chave primária), um subconjunto de registros (chave secundária) ou todos os registros (chave nula). Instituto de Computação - UFF 6

Conceitos sobre arquivos (6/11) • Chave primária: Exemplo 1: (professor, disciplina) Exemplo 2: matrícula

Conceitos sobre arquivos (6/11) • Chave primária: Exemplo 1: (professor, disciplina) Exemplo 2: matrícula • Chave secundária: Exemplo 1: disciplina Exemplo 1: código de turma Instituto de Computação - UFF 7

Conceitos sobre arquivos (7/11) • Elemento de chave: expressão que especifica um conjunto de

Conceitos sobre arquivos (7/11) • Elemento de chave: expressão que especifica um conjunto de valores associados a um atributo. Exemplo: (nota >= 8) • Seleção: critério que destaca um ou mais registros de um arquivo. • Tipos de arquivos: arquivos podem ser essencialmente classificados em dois tipos: arquivos binários e arquivos texto. Instituto de Computação - UFF 8

Conceitos sobre arquivos (8/11) • Arquivos binários: armazenam as informações utilizando o sistema de

Conceitos sobre arquivos (8/11) • Arquivos binários: armazenam as informações utilizando o sistema de numeração binário (caracteres são armazenados através de seu código numérico) • Os registros são da forma como estão representados em memória • A menor unidade de informação capaz de ser lida ou escrita é o registro • Os registros estão dispostos de forma seqüencial no arquivo : 010001101010110100101. . . Instituto de Computação - UFF 9

Conceitos sobre arquivos (9/11) • Arquivos de texto: os dados são representados sob a

Conceitos sobre arquivos (9/11) • Arquivos de texto: os dados são representados sob a forma de caracteres • A menor unidade de informação é o caractere • São tipicamente maiores que os arquivos binários • Os registros podem ser interpretados diretamente • Os dados são organizados seqüencialmente Instituto de Computação - UFF 10

Conceitos sobre arquivos (10/11) • Arquivos podem ser classificados ainda como seqüenciais e arquivos

Conceitos sobre arquivos (10/11) • Arquivos podem ser classificados ainda como seqüenciais e arquivos em série • Arquivos seqüenciais são aqueles em que seus os registros são acessados linearmente, isto é, o registro de ordem i só pode ser acessado após o registro de ordem i-1 • Este tipo de arquivo é adequado para operações que envolvam o percorrimento de todos os registros • Exemplos de processamento que lidam com arquivos sequenciais: geração de folhas de pagamento, listas de presença, transações em arquivos bancários etc Instituto de Computação - UFF 11

Conceitos sobre arquivos (11/11) • Nos arquivos ditos em série, os registros são organizados

Conceitos sobre arquivos (11/11) • Nos arquivos ditos em série, os registros são organizados seguindo um critério de ordenação com base no valor de uma chave ou subconjunto de chaves. • São utilizados tipicamente em processos nos quais as operações envolvem a seleção ou consulta, de um subconjunto do total de registros. Instituto de Computação - UFF 12

Arquivos e fluxos (streams) em Java (1/30) • Os slides a seguir são baseados

Arquivos e fluxos (streams) em Java (1/30) • Os slides a seguir são baseados no livro Aprenda em 21 dias Java 2 • Muitos programas em Java precisam interagir com diferentes fontes de dados • Estas fontes podem ser um arquivos armazenados em um disco rígido ou CD-Rom, páginas Web e até mesmo na memória do computador • Em Java existe um mecanismo unificado para lidar com estas diferentes fontes • O mecanismo de comunicação utilizado por Java se baseia no conceito de fluxo (stream). Instituto de Computação - UFF 13

Arquivos e fluxos (streams) em Java (2/30) • Um fluxo ou stream é um

Arquivos e fluxos (streams) em Java (2/30) • Um fluxo ou stream é um caminho atravessado por dados em um programa • Fluxos podem ser de: • Saída de dados: envia dados de uma origem para o programa • Entrada de dados: envia dados do programa para um destino • Fluxos também podem ser classificados em dois grupos: • Fluxos de bytes • Fluxos de caracteres Instituto de Computação - UFF 14

Arquivos e fluxos (streams) em Java (3/30) • Fluxos de bytes: transportam inteiros com

Arquivos e fluxos (streams) em Java (3/30) • Fluxos de bytes: transportam inteiros com valores de 0 a 255 • Uma grande variedade de dados pode ser expressa no formato de byte, incluindo: • Dados numéricos • Programas executáveis • Comunicações pela Internet • Bytecodes Instituto de Computação - UFF 15

Arquivos e fluxos (streams) em Java (4/30) • Fluxos de caracteres: tipo especializado de

Arquivos e fluxos (streams) em Java (4/30) • Fluxos de caracteres: tipo especializado de stream de bytes que transportam somente dados textuais • Diferenciam-se do stream de bytes devido ao fato de Java aceitar caracteres Unicode • Dados que podem ser mais facilmente expressos como fluxos de carecteres: • Arquivos texto • Páginas web Instituto de Computação - UFF 16

Arquivos e fluxos (streams) em Java (5/30) • Como usar um fluxo: os passos

Arquivos e fluxos (streams) em Java (5/30) • Como usar um fluxo: os passos para manipulação de fluxos de bytes e caracteres são praticamente os mesmos • Lidando com um fluxo de entrada: • Passo 1: criar um objeto de fluxo , por exemplo File. Input. Stream, associado à origem dos dados. • Passo 2: utilizar um ou mais métodos, por exemplo, read(), para ler informações a partir da origem • Passo 3: invocar o método close() para indicar o término do uso do fluxo Instituto de Computação - UFF 17

Arquivos e fluxos (streams) em Java (6/30) • Lidando com um fluxo de saída:

Arquivos e fluxos (streams) em Java (6/30) • Lidando com um fluxo de saída: • Passo 1: criar um objeto de fluxo , por exemplo, File. Output. Stream, associado ao destino dos dados. • Passo 2: utilizar um ou mais métodos, por exemplo, write(), para escrever informações no destino • Passo 3: invocar o método close() para indicar o término do uso do fluxo Instituto de Computação - UFF 18

Arquivos e fluxos (streams) em Java (7/30) • Como usar um filtro • Passo

Arquivos e fluxos (streams) em Java (7/30) • Como usar um filtro • Passo 1: criar um objeto de fluxo associado a origem dos dados ou ao destino dos dados • Passo 2: criar um objeto de tipo filtro • Passo 2: associar o filtro a um fluxo • Passo 3: ler ou escrever no filtro ao invés do fluxo original, usando métodos análogos • Os métodos para leitura e escrita em um filtro são praticamente os mesmos de um fluxo não filtrado • Um filtro pode ser aplicado sobre outro filtro Instituto de Computação - UFF 19

Arquivos e fluxos (streams) em Java (8/30) • Tratamento de exceções e manipulação de

Arquivos e fluxos (streams) em Java (8/30) • Tratamento de exceções e manipulação de fluxos: existem várias exceções no pacote java. io quando se trabalha com fluxos • Exemplos: • File. Not. Found – disparada quando tenta-se criar um objeto de fluxo para uma fonte que não pode ser localizada • EOFException – final de arquivo atingido inesperadamente, enquanto os dados são lidos de um arquivo através de um fluxo de entrada • Ambas as exceções são especilizações de IOException • Uma forma de lidar com tais exceções é delimitar comandos de entrada e saída com blocos try-catch que contém objetos IOException Instituto de Computação - UFF 20

Arquivos e fluxos (streams) em Java (9/30) • Fluxo de bytes: são tratados por

Arquivos e fluxos (streams) em Java (9/30) • Fluxo de bytes: são tratados por subclasses de Input. Stream e Output. Stream • Input. Stream e Output. Stream são classes abstratas e portanto não são instanciáveis • Ao invés de usá-las, utilizamos suas subclasses como, por exemplo: • File. Input. Stream e File. Output. Stream – usadas para lidar com fluxos de bytes armazenados no disco, CD-Rom ou outros dispositivos de armazenamento • Data. Input. Stream e Data. Output. Stream – usadas para lidar com fluxos de bytes filtrados, dos quais dados como inteiros e números em ponto flutuante podem ser lidos Instituto de Computação - UFF 21

Arquivos e fluxos (streams) em Java (10/30) • Fluxo de arquivos: são utilizados para

Arquivos e fluxos (streams) em Java (10/30) • Fluxo de arquivos: são utilizados para que um programa troque dados com arquivos nas unidades de disco, CD-Rom, ou outros dispositivos de armazenamento aos quais é possível se referir utilizando um caminho de pasta e nome de arquivo • Fluxos de entrada: um fluxo de entrada de arquivo pode ser criado com o contrutor File. Input. Stream (String), onde String é o nome do arquivo • Exemplos: File. Input. Stream f = new File. Input. Stream(“arq. dat”); File. Input. Stream f = new File. Input. Stream(“c: \Dados\arq. dat”); \ Windows File. Input. Stream f = new File. Input. Stream(“/Dados/arq. dat”); \ Linux char sep = File. separator; File. Input. Stream f = new File. Input. Stream(sep+”Dados”+sep+”arq. dat”); Instituto de Computação - UFF 22

Arquivos e fluxos (streams) em Java (11/30) • Fluxos de entrada (leitura de bytes):

Arquivos e fluxos (streams) em Java (11/30) • Fluxos de entrada (leitura de bytes): após criado o fluxo, bytes podem ser lidos utilizando o método read() • Para ler mais de um byte utiliza-se read(byte[], int) • Os argumentos tem o seguinte significado, em ordem: • Um array de bytes onde os dados serão armazenados • O elemento dentro do array onde o primeiro byte será armazenado • O número de bytes a serem lidos • Assim método read(byte[], int) retorna o número de bytes lidos ou -1 se nenhum byte tiver sido lido antes de ser atingido o fim do fluxo. Instituto de Computação - UFF 23

Arquivos e fluxos (streams) em Java (12/30) • Fluxos de entrada (exemplo: leitura de

Arquivos e fluxos (streams) em Java (12/30) • Fluxos de entrada (exemplo: leitura de bytes) import java. io. *; public class Read. Bytes { public static void main(String[] arguments) { try { File. Input. Stream file = new File. Input. Stream("class. dat"); boolean eof = false; int count = 0; while (!eof) { int input = file. read(); if (input != -1) { System. out. print(input + " "); count++; } else eof = true; } file. close(); System. out. println("n. Bytes read: " + count); } catch (IOException e) { System. out. println("Error -- " + e. to. String()); } } } Instituto de Computação - UFF 24

Arquivos e fluxos (streams) em Java (13/30) • Fluxo de saída (escrita de bytes)

Arquivos e fluxos (streams) em Java (13/30) • Fluxo de saída (escrita de bytes) : pode ser criado com o contrutor File. Output. Stream (String), onde String é o nome do arquivo • Exemplo: File. Output. Stream f = new File. Output. Stream(“arq. dat”); • Se o arquivo especificado no argumento do construtor for existente, este será apagado quando começar a gravação dos dados no fluxo • É possível criar um fluxo de saída que acrescente dados após o final de um arquivo existente com o construtor File. Output. Stream (String, boolean) Instituto de Computação - UFF 25

Arquivos e fluxos (streams) em Java (14/30) • Fluxos de saída (escrita de bytes):

Arquivos e fluxos (streams) em Java (14/30) • Fluxos de saída (escrita de bytes): após criado o fluxo, bytes podem ser escritos utilizando o método write() • Para escrever mais de um byte utiliza-se write(byte[], int) • Os argumentos tem o seguinte significado, em ordem: • Um array de bytes onde os dados a serem escritos são armazenados • O elemento dentro do array que contém o primeiro byte a ser escrito • O número de bytes a escritos lidos Instituto de Computação - UFF 26

Arquivos e fluxos (streams) em Java (15/30) • Fluxos de entrada (exemplo: escrita de

Arquivos e fluxos (streams) em Java (15/30) • Fluxos de entrada (exemplo: escrita de bytes) import java. io. *; public class Write. Bytes { public static void main(String[] arguments) { int[] data = { 71, 73, 70, 56, 57, 97, 13, 0, 12, 0, 145, 0, 255, 255, 0, 0, 44, 0, 0, 0, 13, 0, 12, 0, 0, 2, 38, 132, 45, 121, 11, 25, 175, 150, 120, 162, 132, 51, 110, 106, 239, 22, 8, 160, 56, 137, 96, 72, 77, 33, 130, 86, 37, 219, 182, 230, 137, 89, 82, 181, 50, 220, 103, 20, 0, 59 }; try { File. Output. Stream file = new File. Output. Stream("pic. gif"); for (int i = 0; i < data. length; i++) file. write(data[i]); file. close(); } catch (IOException e) { System. out. println("Error -- " + e. to. String()); } } } Instituto de Computação - UFF 27

Arquivos e fluxos (streams) em Java (16/30) • Fluxos filtrados: são fluxos que modificam

Arquivos e fluxos (streams) em Java (16/30) • Fluxos filtrados: são fluxos que modificam as informações enviadas por meio de um fluxo existente • São criados usando subclasses de Filter. Input. Stream e Filter. Output. Stream que são abstratas • Ao invés de usá-las, utilizamos suas subclasses como, por exemplo: • Buffered. Input. Stream(Input. Stream) e Buffered. Output. Stream(Output. Stream) – criam fluxos de buffer de entrada e saída, respectivamente, para os objetos de fluxo de especificados. • Buffered. Input. Stream(Input. Stream, int) e Buffered. Output. Stream (Output. Stream, int) – criam fluxos de buffer de entrada e saída, com buffer de tamanho determinado pelo segundo argumento, respectivamente, para os objetos de fluxo de especificados Instituto de Computação - UFF 28

Arquivos e fluxos (streams) em Java (17/30) • Nos fluxos de buffer, os métodos

Arquivos e fluxos (streams) em Java (17/30) • Nos fluxos de buffer, os métodos para leitura e escrita são similares aos fluxos não bufferizados • Quando os dados são direcionados para um fluxo de buffer, eles não saem direto para seu destino até que o buffer seja preenchido ou o método flush() seja invocado Instituto de Computação - UFF 29

Arquivos e fluxos (streams) em Java (18/30) • Fluxos de buffer (exemplo: leitura e

Arquivos e fluxos (streams) em Java (18/30) • Fluxos de buffer (exemplo: leitura e escrita de bytes com buffer) import java. io. *; public class Buffer. Demo { public static void main(String[] arguments) { int start = 0; int finish = 255; if (arguments. length > 1) { start = Integer. parse. Int(arguments[0]); finish = Integer. parse. Int(arguments[1]); } else if (arguments. length > 0) start = Integer. parse. Int(arguments[0]); Arg. Stream as = new Arg. Stream(start, finish); System. out. println("n. Writing: "); boolean success = as. write. Stream(); System. out. println("n. Reading: "); boolean read. Success = as. read. Stream(); } } class Arg. Stream { int start = 0; int finish = 255; Arg. Stream(int st, int fin) { start = st; finish = fin; } boolean write. Stream() { try { File. Output. Stream file = new File. Output. Stream("numbers. dat"); Buffered. Output. Stream buff = new Buffered. Output. Stream(file); for (int out = start; out <= finish; out++) { buff. write(out); System. out. print(" " + out); } buff. close(); return true; } catch (IOException e) { System. out. println("Exception: " + e. get. Message()); return false; } } // continua na próxima caixa de texto // continuação da caixa de texto anterior boolean read. Stream() { try { File. Input. Stream file = new File. Input. Stream("numbers. dat"); Buffered. Input. Stream buff = new Buffered. Input. Stream(file); int in = 0; do { in = buff. read(); if (in != -1) System. out. print(" " + in); } while (in != -1); buff. close(); return true; } catch (IOException e) { System. out. println("Exception: " + e. get. Message()); return false; } } } Instituto de Computação - UFF 30

Arquivos e fluxos (streams) em Java (19/30) • Fluxos de caracteres: são usados para

Arquivos e fluxos (streams) em Java (19/30) • Fluxos de caracteres: são usados para trabalhar com qualquer texto que seja representado por um conjunto de caracteres ASCII ou Unicode. Exemplos: arquivos texto puros, páginas HTML, códigos fonte Java. • As classes usadas para ler e escrever em fluxos de caracteres são subclasses de Reader e Writer que são abstratas • Ao invés de usá-las, utilizamos suas subclasses como: • Input. Stream. Reader(String) e Output. Stream. Writer(String) – criam fluxos de caracters de entrada e saída, respectivamente • É comum o uso da subclasse File. Reader de Input. Stream. Reader e a subclasse File. Writer de Output. Stream. Writer 31 Instituto de Computação - UFF

Arquivos e fluxos (streams) em Java (20/30) • Fluxos de caracteres (exemplo de leitura)

Arquivos e fluxos (streams) em Java (20/30) • Fluxos de caracteres (exemplo de leitura) import java. io. *; public class Read. Source { public static void main(String[] arguments) { try { File. Reader file = new File. Reader("Read. Source. java"); Buffered. Reader buff = new Buffered. Reader(file); boolean eof = false; while (!eof) { String line = buff. read. Line(); if (line == null) eof = true; else System. out. println(line); } buff. close(); } catch (IOException e) { System. out. println("Error -- " + e. to. String()); } } } Instituto de Computação - UFF 32

Arquivos e fluxos (streams) em Java (21/30) • Fluxos de caracteres (exemplo de escrita)

Arquivos e fluxos (streams) em Java (21/30) • Fluxos de caracteres (exemplo de escrita) // Create output stream File. Writer fw = new File. Writer(temp); Buffered. Writer out = new Buffered. Writer(fw); import java. io. *; public class All. Caps. Demo { public static void main(String[] arguments) { All. Caps cap = new All. Caps(arguments[0]); cap. convert(); } } class All. Caps { String source. Name; All. Caps(String source. Arg) { source. Name = source. Arg; } void convert() { try { // Create file objects File source = new File(source. Name); File temp = new File("cap" + source. Name + ". tmp"); // Create input stream File. Reader fr = new File. Reader(source); Buffered. Reader in = new Buffered. Reader(fr); // continua na caixa de texto ao lado boolean eof = false; int in. Char = 0; do { in. Char = in. read(); if (in. Char != -1) { char out. Char = Character. to. Upper. Case( (char)in. Char ); out. write(out. Char); } else eof = true; } while (!eof); in. close(); out. close(); boolean deleted = source. delete(); if (deleted) temp. rename. To(source); } catch (IOException e) { System. out. println("Error -- " + e. to. String()); } catch (Security. Exception se) { System. out. println("Error -- " + se. to. String()); } } } Instituto de Computação - UFF 33

Arquivos e fluxos (streams) em Java (22/30) • Arquivos de acesso direto (Random Acess

Arquivos e fluxos (streams) em Java (22/30) • Arquivos de acesso direto (Random Acess Files): são formas de organização de arquivos que permitem acesso direto a uma dada posição , sem a necessidade de percorrer as posições anteriores em sequencia • Quando o arquivo é organizado em registros, cada registro ocupa uma posição ou ordem i que pode ser acessada diretamente • O primeiro registro ocupa possui ordem zero Instituto de Computação - UFF 34

Arquivos e fluxos (streams) em Java (23/30) • Os registros tipicamente tem tamanho fixo

Arquivos e fluxos (streams) em Java (23/30) • Os registros tipicamente tem tamanho fixo onde cada campo ocupa um número de bytes pré-determinado • O registro de ordem 2, por exemplo, está no byte 44 10 bytes registro 4 bytes(int) 8 bytes(double) s a b ã o 11 6, 25 e s c o v a 12 7, 45 p a s t a 13 9, 99 f d e n t 14 7, 25 21 4, 45 22 12, 00 23 3, 45 i o b o l a c h a b o m t o a l b i s c o i v i n h o 31 20, 00 c a c h a ç A 32 14, 00 Instituto de Computação - UFF 35

Arquivos e fluxos (streams) em Java (24/30) • Em Java, arquivo de acesso direto

Arquivos e fluxos (streams) em Java (24/30) • Em Java, arquivo de acesso direto podem ser implementados através da classe Random Access. File • Uma das operações mais importantes é disponibilizada através do método seek(int pos) seek(TAM_REG*4) 10 bytes registro 4 bytes(int) 8 bytes(double) s a b ã o 11 6, 25 e s c o v a 12 7, 45 p a s t a 13 9, 99 f d e n t 14 7, 25 21 4, 45 22 12, 00 23 3, 45 i o b o l a c h a b o m t o a l b i s c o i v i n h o 31 20, 00 c a c h a ç a 32 14, 00 Instituto de Computação - UFF 36

Arquivos e fluxos (streams) em Java (25/30) • Arquivos de acesso direto: classe que

Arquivos e fluxos (streams) em Java (25/30) • Arquivos de acesso direto: classe que acessa um arquivo de bytes diretamente import java. io. *; public class Random. Access. File. IO { private Random. Access. File raf=null; public Random. Access. File. IO(){ } public void open(String file. Name, String io. Args){ if (raf==null) try { raf = new Random. Access. File(file. Name, io. Args); } catch (File. Not. Found. Exception e) { e. print. Stack. Trace(); } } public void close(){ if (raf!=null) try { raf. close(); raf = null; } catch (IOException e) { e. print. Stack. Trace(); } } public void write(int pos, int value){ try { raf. seek(pos); raf. write(value); } catch (IOException e) { e. print. Stack. Trace(); } } public int read(int pos, int value){ int val = -1; try { raf. seek(pos); val = raf. read(); } catch (IOException e) { e. print. Stack. Trace(); } return val; } public void add. Noise(double percentage){ try { for (int i = 0; i < raf. length() * percentage; i++) { int pos = (int) (Math. random() * (double)raf. length()); raf. seek(pos); raf. write. Byte(128); } catch (IOException e) { e. print. Stack. Trace(); } } } Instituto de Computação - UFF 37

Arquivos e fluxos (streams) em Java (26/30) • Arquivos de acesso direto: exemplo onde

Arquivos e fluxos (streams) em Java (26/30) • Arquivos de acesso direto: exemplo onde o registro é um byte public class Image. Raw. Gray. Scale { private int width, height; private int[] data; public void save(String file. Name){ try { File. Output. Stream file = new File. Output. Stream(file. Name); for (int i = 0; i < data. length; i++) file. write(data[i]); file. close(); } catch (IOException e) { e. print. Stack. Trace(); } } public Image. Raw. Gray. Scale(int width, int height){ this. width = width; this. height = height; this. data = new int[width*height]; } public int get. Width() { return width; } public int get. Height() { return height; } public int get. Gray. Level(int i, int j){ return data[i*width+j]; } public void load(String file. Name){ try { File. Input. Stream file = new File. Input. Stream(file. Name); for (int i = 0; i < data. length; i++) data[i] = file. read(); file. close(); } catch (IOException e) { e. print. Stack. Trace(); } } public void print(){ for (int i=0; i<height; i++){ for (int j=0; j<width; j++){ int gray. Level = get. Gray. Level(i, j); if (gray. Level==255) System. out. print(" "); else if (gray. Level>0) System. out. print("++"); else System. out. print("oo"); } System. out. println(); } } } Instituto de Computação - UFF 38

Arquivos e fluxos (streams) em Java (27/30) • Arquivos de acesso direto: no exemplo

Arquivos e fluxos (streams) em Java (27/30) • Arquivos de acesso direto: no exemplo abaixo uma imagem em formato Raw de 64 x 64 pixels em tons de cinza é lida e corrompida com ruído public class Image. Random. Access. File { public static void main(String[] args){ Image. Raw. Gray. Scale image = new Image. Raw. Gray. Scale(64, 64); image. load("pic"); image. print(); image. save("picnoise"); Random. Access. File. IO random. Access. File = new Random. Access. File. IO(); random. Access. File. open("picnoise", "rw"); random. Access. File. add. Noise(0. 1); random. Access. File. close(); Image. Raw. Gray. Scale image 2 = new Image. Raw. Gray. Scale(64, 64); image 2. load("picnoise"); image 2. print(); } } Instituto de Computação - UFF 39

Arquivos e fluxos (streams) em Java (28/30) • public void seek(long pos) throws IOException

Arquivos e fluxos (streams) em Java (28/30) • public void seek(long pos) throws IOException • Posiciona o ponteiro para o arquivo, medido a partir do seu início, na posição em que ocorrerá a próxima leitura ou escrita • O deslocamento (ponteiro) pode ser posicionado além do fim do arquivo, porém o tamanho do arquivo somente mudará após através de uma operação de escrita além da posição do ponteiro • Parâmetros: • pos – a nova posição do ponteiro, medida em bytes a partir do início do arquivo. Exceções: IOException – se pos for menor que zero ou se um erro de IO ocorrer. Instituto de Computação - UFF 40

Arquivos e fluxos (streams) em Java (29/30) • Serialização: mecanismo da linguagem Java que

Arquivos e fluxos (streams) em Java (29/30) • Serialização: mecanismo da linguagem Java que permite persistir objetos, isto é, eles passam a existir mesmo quando o programa não está sendo executado • Para que um objeto possa ser persistido, ele precisa serializado, isto é, decomposto em cada um de seus elementos que são enviados para memória secundária em série, como numa linha de montagem • Para que um objeto possa serializado ele deve implementar a interface Serializable • Não é necessário implementar nenhum método já que Serializable não especifica nenhum deles Instituto de Computação - UFF 41

Arquivos e fluxos (streams) em Java (30/30) • Quando um objeto é persistido, todos

Arquivos e fluxos (streams) em Java (30/30) • Quando um objeto é persistido, todos os objetos que o compõem também são desde que implementem Serializable • Algumas variáveis de instância podem não ser persistidas: para isto devem ser declaradas como transient Instituto de Computação - UFF 42