·

Análise de Sistemas ·

Linguagens de Programação

Send your question to AI and receive an answer instantly

Ask Question

Preview text

Laboratório de Programação II Arquivos Prof Me Rober Marcone Rosi Unidade de Engenharia e Computação O que é um arquivo Um arquivo é um local reservado para se guardar informações escritas para uso futuro Um bom exemplo são os arquivos de aço com pastas e documentos O arquivo de computador é uma maneira de armazenar informações em meios físicos magnéticos ou ópticos como por exemplo discos rígidos discos flexíveis pen drives CDs e etc 2 Arquivotexto Os arquivostexto são organizados em registros e campos 3 Formas de acesso O Java vê cada arquivo como um fluxo sequencial de bytes O sistema operacional fornece um mecanismo para determinar o final do arquivo Como um marcador de fim do arquivo ou uma contagem do total de bytes no arquivo que é registrado nos dados mantidos na estrutura do sistema administrativo Um programa Java que processa um fluxo de bytes recebe uma indicação do sistema operacional sobre quando o programa alcança o final do fluxo 4 Formas de acesso Fluxos de arquivos Fluxos baseados em bytes representam dados no formato binário Arquivos binários criados a partir de fluxos baseados em bytes lidos por um programa que converte os dados em formato legível por humanos Fluxos baseados em caracteres armazenam os dados como uma sequência de caracteres Arquivos de texto criados a partir de fluxos baseados em caracteres eles podem ser lidos por editores de textos O Java abre o arquivo criando um objeto e associando um fluxo a ele 5 Formas de acesso Fluxospadrão cada fluxo pode ser redirecionado Systemin objeto do fluxo de entradapadrão ele pode ser redirecionado com o método setIn Systemout objeto do fluxo de saídapadrão ele pode ser redirecionado com o método setOut Systemerr objeto do fluxo de erropadrão ele pode ser redirecionado com o método setErr 6 Formas de acesso Classes javaio Fonte Devmedia Formas de acesso Classes javaio FileInputStream e FileOutputStream ES baseada em bytes FileReader e FileWriter ES baseada em caracteres ObjectInputStream e ObjectOutputStream os objetos dessas classes podem ser utilizados para ES de objetos ou variáveis de tipos de dados primitivos File útil para obter informações sobre arquivos e diretórios 8 Formas de acesso Classes Scanner e Formatter Scanner pode ser utilizada para ler facilmente os dados em um arquivo Formatter pode ser utilizada para gravar facilmente dados em um arquivo 9 Visualização do Java de um arquivo de nbytes Formas de acesso Arquivos seqüenciais armazenam informações em caracteres no formato ASCII e os dados são gravados na ordem em que são digitados As informações são lidas na mesma ordem em que foram inseridas isto é em seqüência Arquivos de acesso aleatório ou randômico cada registro é gravado em uma posição específica As informações podem ser lidas independentemente da ordem em que foram inseridas 10 Operações de manipulação de arquivos Para a manipulação dos arquivos existem quatro operações básicas que podem ser realizadas 11 Inserção de dados inclusão de novos registros Consulta aos dados operação de leitura ou busca dos dados já armazenados Alteração dos dados tratase da possibilidade de alteração de um ou mais campos do conjunto Exclusão de dados corresponde à operação de eliminação de registros Create Retrieve Update e Delete C R U D A Classe File Classe File útil para recuperar informações sobre arquivos e diretórios no disco nome diretório tamanho permissões de escrita e leitura e outras informações A classe File é ainda uma representação para arquivos e diretórios de sistema trazendo informações adicionais sobre o sistema operacional tais como qual caractere é separador de diretório informações sobre discos disponíveis etc Os objetos da classe File não abrem arquivos nem fornecem capacidades de processamento de arquivos 12 A Classe File Em Java a classe File permite representar arquivos nesse nível de abstração Um dos construtores desta classe recebe como argumento uma string que pode identificar por exemplo o nome de um arquivo em disco Os métodos desta classe permitem obter informações sobre o arquivo Por exemplo exists canRead canWrite length e lastModified e realizar operações sobre o arquivo como um todo como em delete e deleteOnExit 13 A Classe File A classe File fornece quatro construtores 1 Recebe String que especifica nome e caminho localização do arquivo no disco 2 Recebe duas Strings a primeira especificando o caminho e a segunda especificando o nome do arquivo 3 Recebe o objeto File que especifica o caminho e String que especifica o nome do arquivo 4 Recebe o objeto URI que especifica o nome e a localização do arquivo 14 Método Descrição String getAbsolutePath Retorna uma string com o caminho absoluto do arquivo ou diretório String getName Retorna uma string com o nome do arquivo ou diretório String getPath Retorna uma string com o caminho do arquivo ou diretório String getParent Retorna uma string com o diretóriopai do arquivo ou diretório isto é o diretório em que o arquivo ou diretório pode ser localizado long length Retorna o comprimento do arquivo em bytes Se o objeto File representar um diretório 0 é retornado long lastModified Retorna uma representação dependente de plataforma da datahora em que o arquivo ou diretório for modificado pela última vez O valor retornado é útil somente para comparação com outros valores retornados por esse método String list Retorna um array de strings que representam o conteúdo de um diretório Retorna null se o objeto File não representar um diretório Método Descrição boolean canRead Retorna true se um arquivo for legível pelo aplicativo atual boolean canWrite Retorna true se um arquivo for gravável pelo aplicativo atual boolean exists Retorna true se o nome especificado como o argumento para o construtor File for um arquivo ou diretório no caminho especificado boolean isFile Retorna true se o nome especificado como o argumento para o construtor File for um arquivo boolean isDirectory Retorna true se o nome especificado como o argumento para o construtor File for um diretório boolean isAbsolute Retorna true se os argumentos especificados para o construtor File indicarem um caminho absoluto para um arquivo ou diretório Métodos File comuns 17 exists retorna true se o arquivo existir onde especificado isFile retorna true se File for um arquivo não um diretório isDirectory retorna true se File for um diretório getPath retorna o caminho de arquivo como uma string list recupera o conteúdo de um diretório Dica 18 O método File utiliza isFile para determinar se um objeto File representa um arquivo não um diretório antes de tentar abrir o arquivo Utilizar como um separador de diretório em vez de em uma literal de string é um erro de lógicaUma simples indica que a seguida pelo próximo caractere representa uma sequencia de escapeUtilize para inserir uma em uma literal de string Arquivos de texto de acesso sequencial 19 Os registros são armazenados na ordem por campo de chave de registro Podem ser criados como arquivos de texto ou arquivos binários O Java não impõe nenhuma estrutura a um arquivo registros não existem como parte da linguagem Java O programador deve estruturar os arquivos Criando um arquivo de texto de acesso sequencial 20 A classe Formatter pode ser utilizada para abrir um arquivo de texto para gravar Passa o nome de arquivo para o construtor Se o arquivo não existir ele será criado Se o arquivo já existir o conteúdo será truncado descartado Utiliza o método format para gravar texto formatado no arquivo Utiliza o método close para fechar o objeto Formatter se esse método não for chamado o SO normalmente fecha o arquivo quando o programa é fechado Criando um arquivo de texto de acesso sequencial 21 Possíveis exceções SecurityException ocorre ao abrir o arquivo utilizando o objeto Formatter se o usuário não tiver permissão para gravar dados no arquivo FileNotFoundException ocorre ao abrir o arquivo utilizando o objeto Formatter se o arquivo não puder ser localizado e um novo arquivo não puder ser criado NoSuchElementException ocorre quando uma entrada inválida é lida por um objeto Scanner FormatterClosedException ocorre quando é feita uma tentativa de gravar em um arquivo utilizando um objeto Formatter já fechado Lendo dados a partir de um arquivo de texto de acesso sequencial 22 Os dados são armazenados em arquivos de modo que eles possam ser recuperados para processamento quando necessário O objeto Scanner pode ser utilizado para ler dados sequencialmente em um arquivo de texto Passa o objeto File que representa o arquivo a ser lido para o construtor Scanner FileNotFoundException ocorre se o arquivo não puder ser localizado Os dados são lidos no arquivo utilizando os mesmos métodos como entrada de teclado nextInt nextDouble next etc IllegalStateException ocorre se for feita uma tentativa de ler um objeto Scanner fechado Tutorial Arquivos em JAVA Rober Marcone Rosi Motivação Em algumas situações é desejado ler dados de arquivos eescrever dados em arquivos o Não é necessário digitar via teclado os dados a cada execuçãodo programa o Os resultados do programa podem ser impressos ou enviadospara outras pessoas com mais facilidade o O estado do programa jogo por exemplo pode ser salvo erecarregado em outro momento Escrita de arquivos É muito parecido com escrita no monitor só que precisaconectar com o arquivo antes Vamos ver um exemplo Exemplo escrevendo 100 números aleatórios no monitor public class Monitor public static void mainString args for int i 0 i 100 i SystemoutprintlnMathroundMathrandom 100 Exemplo escrevendo 100 números aleatórios em um arquivo import javaioFileWriter import javaioPrintWriter public class Arquivo public static void mainString args PrintWriter arquivo null try FileWriter out new FileWriternumerostxt arquivo new PrintWriterout for int i 0 i 100 i arquivoprintlnMathroundMathrandom 100 catch Exception e Systemoutprintlne finally arquivoclose Exemplo escrevendo 100 números aleatórios em um arquivo import javaioFileWriter import javaioPrintWriter public class Arquivo O arquivo aparecerá na raiz do projeto do public static void mainString args NetBeans PrintWriter arquivo null try FileWriter out new FileWriternumerostxt arquivo new PrintWriterout for int i 0 i 100 i arquivoprintlnMathroundMathrandom 100 catch Exception e Systemoutprintlne finally arquivoclose Abertura do arquivo para escrita e posterior fechamento Exemplo escrevendo 100 números aleatórios em um arquivo import javaioFileWriter import javaioPrintWriter public class Arquivo public static void mainString args PrintWriter arquivo null try FileWriter out new FileWriternumerostxt arquivo new PrintWriterout for int i 0 i 100 i arquivoprintlnMathroundMathrandom 100 catch Exception e Systemoutprintlne finally arquivoclose Escrita no arquivo Exemplo escrevendo 100 números aleatórios em um arquivo import javaioFileWriter import javaioPrintWriter public class Arquivo public static void mainString args PrintWriter arquivo null try FileWriter out new FileWriternumerostxt arquivo new PrintWriterout for int i 0 i 100 i arquivoprintlnMathroundMathrandom 100 catch Exception e Systemoutprintlne finally arquivoclose tratamento de exceção no acesso ao arquivo Equivalente ao seguinte código import javaioPrintWriter public class Arquivo public static void mainString args try PrintWriter arquivo new PrintWriternumerostxt for int i 0 i 100 i arquivoprintlnMathroundMathrandom 100 catch Exception e Systemoutprintlne Leitura de arquivos Novamente é muito parecido com leitura do teclado sóque precisa conectar com o arquivo antes Vamos ver um exemplo Exemplo lendo 100 números do teclado e escrevendo a média import javautilScanner public class Teclado public static void mainString args Scanner teclado new ScannerSystemin int soma 0 for int i 0 i 100 i soma tecladonextInt SystemoutprintlnMédia soma 100f Exemplo lendo 100 números de um arquivo e escrevendo a média import javaioFileReader import javautilScanner public class Arquivo public static void mainString args Scanner arquivo null try FileReader in new FileReadernumerostxt arquivo new Scannerin int soma 0 for int i 0 i 100 i soma arquivonextInt SystemoutprintlnMédia soma 100f catch Exception e Systemoutprintlne finally arquivoclose Exemplo lendo 100 números de um arquivo e escrevendo a média import javaioFileReader import javautilScanner public class Arquivo O arquivo será procurado na raiz do projeto do public static void mainString args NetBeans Scanner arquivo null try FileReader in new FileReadernumerostxt arquivo new Scannerin int soma 0 for int i 0 i 100 i soma arquivonextInt SystemoutprintlnMédia soma 100f catch Exception e Systemoutprintlne finally arquivoclose Abertura do arquivo para leitura e posterior fechamento Exemplo lendo 100 números de um arquivo e escrevendo a média import javaioFileReader import javautilScanner public class Arquivo public static void mainString args Scanner arquivo null try FileReader in new FileReadernumerostxt arquivo new Scannerin int soma 0 for int i 0 i 100 i soma arquivonextInt SystemoutprintlnMédia soma 100f catch Exception e Systemoutprintlne finally arquivoclose Leitura do arquivo Exemplo lendo 100 números de um arquivo e escrevendo a média import javaioFileReader import javautilScanner public class Arquivo public static void mainString args Scanner arquivo null try FileReader in new FileReadernumerostxt arquivo new Scannerin int soma 0 for int i 0 i 100 i soma arquivonextInt SystemoutprintlnMédia soma 100f catch Exception e Systemoutprintlne finally arquivoclose tratamento de exceção no acesso ao arquivo Equivalente ao seguinte código import javaioFileReader import javautilScanner public class Arquivo public static void mainString args try Scanner arquivo new Scannernew FileReadernumerostxt int soma 0 for int i 0 i 100 i soma arquivonextInt SystemoutprintlnMédia soma 100f catch Exception e Systemoutprintlne E como tratar diferentes tipos Fácil é só fazer como faria no caso de escrita nomonitor e leitura do teclado Exemplo vamos fazer dois programas 1 Um que leia os dados de uma pessoa primeiro nome último nome e idade e escreva em um arquivo 2 Outro que liste os dados desse arquivo Importante respeitar a estrutura do arquivo o O arquivo deve ser lido sempre na mesma ordem em que foi gravado Exemplo Cadastro de pessoas import javaioFileWriter import javaioPrintWriter import javautilScanner public class Cadastro public static void mainString args Scanner teclado new ScannerSystemin try PrintWriter arquivo new PrintWriternew FileWriterpessoastxt true arquivoprintln SystemoutprintPrimeiro nome arquivoprinttecladonext SystemoutprintÚltimo nome arquivoprinttecladonext SystemoutprintIdade arquivoprinttecladonextInt catch Exception e Systemoutprintlne Concatena com os dados preexistentes no arquivo Exemplo Listagem das pessoas cadastradas import javaioFileReader import javautilScanner public class Listagem public static void mainString args try Scanner arquivo new Scannernew FileReaderpessoastxt while arquivohasNext String primeiroNome arquivonext String ultimoNome arquivonext int idade arquivonextInt SystemoutprintlnprimeiroNome ultimoNome tem idade anos de idade catch Exception e Systemoutprintlne Exercício 1 Faça um programa que leia um número N e gere um arquivo com N nomes e idades aleatórios o Faça uso de dois arquivos criados na mão um que contenha 20 nomes e outro que contenha 20 sobrenomes o Gere aleatoriamente de 0 a 2 iniciais de nome do meio e a idade o Cada linha deve conter um nome completo e a sua idade Exercício 2 Faça um programa que leia o arquivo de nomes e idades aleatórios do exercício anterior e gere um arquivo de índice ordenado por nome o Cada linha do arquivo de índice deve conter o número da linhaequivalente do arquivo aleatório 3 Faça um programa que leia o arquivo de nomes e idades aleatórios do exercício anterior e gere um arquivo de índice ordenado por idade o Cada linha do arquivo de índice deve conter o número da linha equivalente do arquivo aleatório Exercício 4 Estenda o exemplo do cadastro para considerar também a altura da pessoa o Armazene a altura como float usando como separador dedecimais e somente 2 casas decimais ex 188 o Para alterar a forma com que o float é escrito no arquivo use o método PrintWriterformat no lugar de PrintWriterprint o Leia o capítulo sobre formatação de saída no tutorial httpdocsoraclecomjavasetutorialessentialioformattinghtm l o Dica para escrever a altura no arquivo use arquivoformatLocaleforLanguageTagptBR 2f altura no lugar de arquivoprintaltura Referências Slides de Vanessa Braganholo UFF