BC0502 – Metodologia e Algoritmos Assunto: Roteiro Java – Arquivos Aula Prática: 05 1. Introdução Nesta prática, resolveremos um exercício sobre arquivos, tema abordado na aula teórica desta semana. Os arquivos permitem que o programa acesse e envie dados externos a ele. Java permite lidar com todos os tipos de entrada e saída através de uma abstração conhecida como stream (canal, fluxo de dados). Streams são unidirecionais e podem ser de dois tipos: − Leitura: para obter informações externas; − Escrita: para enviar informações. O pacote java.io define um grande número de classes para ler e escrever streams. As classes são divididas em dois grupos, baseadas no tipo de dados sobre os quais operam: − InputStream e OutputStream: E/S de dados binários (tipo byte) − Reader e Writer: E/S de caracteres (tipo char) no padrão Unicode (16 bits) A seguir são apresentados exemplos da implementação do uso de arquivos de texto. São duas classes: - UsarArquivo, que contém o programa principal; - GerenciamentoArquivos, que contém os métodos para a leitura e escrita de dados em um arquivo. public class UsarArquivo { public static void main( String[] args ) { String nome[]=new String [3]; int idade[]=new int [3]; double nota[] = new double [3]; nome[0] = "José da Silva"; nome[1] = "Márcia Bastos"; nome[2] = "Carla Pereira"; idade[0] = 23; idade[1] = 20; idade[2] = 18; nota[0] = 7.5; nota[1] = 7; nota[2] = 8.5; GerenciamentoArquivos gerente = new GerenciamentoArquivos(); gerente.escrita( "teste.dat", nome, idade, nota ); gerente.leitura( "teste.dat" ); } } 1 import java.io.*; public class GerenciamentoArquivos { public void escrita ( String nomeArq, String[] vet1, int[] vet2, double[] vet3 ) { try { FileWriter arq = new FileWriter( nomeArq ); PrintWriter out = new PrintWriter( arq ); for ( int i=0; i<vet1.length; i++ ) { String linha = vet1[i] + ":" + vet2[i] + ":" + vet3[i]; out.println( linha ); } out.close(); } } catch ( IOException erro ) { System.out.println ( "Erro na escrita dos dados" ); } //fim do método escrita() public void leitura ( String nomeArq ) { try { FileReader ent = new FileReader( nomeArq ); BufferedReader br = new BufferedReader ( ent ); String linha; String[] campos = null; while ( (linha = br.readLine()) != null ) { campos = linha.split( ":" ); String nome = campos[ 0 ]; int idade = Integer.parseInt(campos[1]); double nota = Double.parseDouble(campos[2]); System.out.println( "Nome: " + nome + "\nIdade: " + idade + "\nNota: " + nota ); } br.close(); } catch ( IOException erro ) 2 { System.out.println ( "Erro na leitura dos dados" ); } } } // Fim do método leitura() // Fim da classe GerenciamentoArquivos 2. Exercício da aula – Campeonato de Futebol Em um campeonato de futebol, quatro times (A, B, C e D) jogam partidas no esquema turno-returno. Para dois times A e B, sendo o turno disputado no campo de A, o returno é disputado no campo de B. Os resultados dos jogos encontram-se armazenados em um arquivo, em um formato como no exemplo abaixo: *;v;e;v e;*;e;d v;v;*;d e;v;e;* Este arquivo pode ser entendido como uma matriz, da seguinte forma: A B C D A * e v e B v * v v C e e * e D v d d * O símbolo “v” indica vitória do time da casa, o símbolo “e” indica empate e o símbolo “d” indica derrota do time da casa. O símbolo “*” indica a informação “não importa”, pois um time não joga contra si mesmo. Assim, cada linha apresenta os resultados de um time em seu campo. Ou seja, a primeira linha corresponde aos resultados do time A quando ele jogou em seu campo. Temos assim que: A venceu B, empatou com C e venceu D. As colunas representam então os resultados de cada time nos campos dos adversários, porém nesse caso o símbolo “v” significa derrota no campo do adversário (= vitória do time da casa) e o símbolo “d” significa vitória no campo do adversário (= derrota do time da casa). Para a primeira coluna, temos: A empatou com B, perdeu de C e empatou com D. Faça um programa em Java que leia essa matriz do arquivo, armazenando-a em uma matriz do tipo String, e forneça o número total de pontos obtido por cada time no campeonato (turno e returno) em um arquivo “resultados.txt”. Não é necessário fornecer a classificação final dos quatro times. Considere que cada vitória vale 3 pontos no campeonato, os empates valem um ponto e as derrotas, 0 pontos. O programa deve pedir para o usuário os nomes dos times A, B, C e D. Dicas: Use o projeto “campeonato_set2007” já iniciado, que se encontra compactado dentro do mesmo módulo no COL. O aplicativo deve ser composto por três classes. Uma para o programa principal (Campenoato.java), uma para a manipulação dos arquivos (GerenciamentoArquivos.java) e outra para a manipulação dos cálculos de pontos do 3 campeonato (Pontos.java), sendo que esta classe já está completamente pronta, para facilitar. O uso de blocos de tratamento de exceções (try – catch) é obrigatório, pois caso contrário o compilador Java vai acusar um erro. Para ganhar ainda mais tempo, copie e cole trechos de código dos exemplos acima para o seu programa. Para facilitar, o método de leitura dos dados do arquivo para dentro da matriz também já está implementado na classe GerenciamentoArquivos. No NetBeans, o programa considera a pasta atual como sendo a pasta do projeto (onde será gravado o arquivo de saída “resultados.txt” e onde deve estar o arquivo de entrada “matriz.txt”). 3. Exercício para trabalhar em casa – Continuação 2) Considere que, no exemplo anterior, os times A, B, C e D são correspondentes a Grêmio, Boca Juniors, Santos e Cúcuta, quatro primeiro colocados da Libertadores. Gere um novo arquivo para um campeonato Europeu, em que os times são: Milan, Real Madrid, Liverpool e Bayer de Munique. Preencha a matriz como no exercício 1, porém alterando o seu conteúdo, como desejado. Obtenha as classificações para esses dois grupos de times. Os dois primeiros colocados de cada campeonato participarão do Mundial do Japão e o disputarão em turno e returno também. Forneça então a classificação final desses times no Mundial em um arquivo “mundial.txt”. Atente para o fato de que será necessário manipular dois arquivos de entrada: do campeonato brasileiro e do campeonato europeu e ainda um arquivo de saída (mundial). 4