APROG Algoritmia e Programação Ficheiros de Texto Java Nelson Freire (ISEP–DEI-APROG 2014/15) 1/18 Ficheiros de Texto Noção de Ficheiro Estrutura de Dados Armazena Sequência de Dados Dado 1 Dado 2 ... Dado N Comprimento arbitrário Dados de tipos diferentes Modo Permanente Memória Principal (RAM) Processador (CPU) Nelson Freire (ISEP–DEI-APROG 2014/15) // em memória secundária Memória Secundária (Disco Interno) Memória Secundária (PenDrive, Disco Externo, CD, DVD) 2/18 Tipos de Ficheiros Ficheiros de Texto Programa Ficheiro Texto Ficheiro Binário APROG aborda apenas os ficheiros de texto Tipos de Ficheiros Tipos de Ficheiros Sequência Formato dos Dados Processadores de Texto Interesse Legível Guardar Dados Públicos Ilegível Guardar Dados Privados Carateres Texto Binário (Codificação baseada em tabelas de carateres, por exemplo: ASCII, Unicode (UTF-8, ...), etc.) Códigos Binários Nelson Freire (ISEP–DEI-APROG 2014/15) Texto Binário 3/18 Ficheiros de Texto Operações sobre Ficheiros Tipos Leitura Escrita Nelson Freire (ISEP–DEI-APROG 2014/15) 4/18 Leitura de Ficheiro de Texto Ficheiros de Texto 1/4 Procedimento 1. Abrir Ficheiro // recursos do Sistema Operativo alocados para a leitura do ficheiro // Ex: buffers (memória temporária) 2. Ler Ficheiro 3. Fechar Ficheiro // libertar recursos alocados Nelson Freire (ISEP–DEI-APROG 2014/15) 5/18 Leitura de Ficheiro de Texto Ficheiros de Texto 2/4 Abrir Ficheiro Classes File Scanner // package java.io // package java.util Objeto Scanner ... para ler Exemplos import java.io.File; import java.util.Scanner; public class DemoFicheiro { public static void main(String[] args) throws Exception { File f = new File("c:\\nomes.txt"); Scanner fich1 = new Scanner( f ); Alternativa: Scanner fich1 = new Scanner( new File("c:\\nomes.txt") ); ... Scanner fich2 = new Scanner(new File("c:/equipas.txt")); Scanner fich3 = new Scanner(new File("c:\\jogos.txt")); Scanner fich4 = new Scanner(new File("d:\\aprog\\int.txt")); Scanner fich5 = new Scanner(new File("notas.txt")); // ficheiro na pasta do projeto Netbeans ... } } Nelson Freire (ISEP–DEI-APROG 2014/15) 6/18 Leitura de Ficheiro de Texto Ficheiros de Texto 3/4 Ler Ficheiro Ler uma Palavra String palavra = objetoScanner.next(); Ler uma Linha String linha = objetoScanner.nextLine(); Ler todas as linhas Ler linha-a-linha ... até ao fim do ficheiro Indicação do fim do ficheiro objetoScanner.hasNextLine() == false import java.io.File; import java.util.Scanner; public class DemoFicheiro { public static void main(String[] args) throws Exception { Scanner fich = new Scanner(new File(" c:\\nomes.txt ")); // leitura de ficheiro linha-a-linha while ( fich.hasNextLine() ){ System.out.println( fich.nextLine() ); } ... } } Nelson Freire (ISEP–DEI-APROG 2014/15) 7/18 Ficheiros de Texto Leitura de Ficheiro de Texto 4/4 Fechar Ficheiro objetoScanner.close(); Exemplo import java.io.File; import java.util.Scanner; public class DemoFicheiro { public static void main(String[] args) throws Exception { Scanner fich = new Scanner( new File(" c:\\nomes.txt ") ); // leitura de ficheiro linha-a-linha while ( fich.hasNextLine() ){ System.out.println( fich.nextLine() ); } fich.close(); } } Nelson Freire (ISEP–DEI-APROG 2014/15) 8/18 Classe String : método split Ficheiros de Texto 1/6 Interesse Decompor uma string em partes separadas por delimitadores: iguais ou diferentes Exemplo: Delimitadores Iguais String registo = "joão/1961/10/1"; Delimitador Obtenção dos campos do registo (partes da string) String[] campos; // vetor para guardar partes da string registo (campos) campos = registo.split("/"); // 1. Decompõe o registo pelo delimitador / // 2. Cria um vetor de strings (comprimento = nº partes) // 3. Guarda as partes (substrings) em elementos diferentes Resultado campos "joão" "1961" "10" "1" 0 1 2 3 Exemplo: Delimitadores Diferentes String s = "5-6+7-8"; String[] c = s.split("[+-]"); // c[0]="5", c[1]="6", c[2]="7", c[3]="8" Nelson Freire (ISEP–DEI-APROG 2014/15) 9/18 Ficheiros de Texto Classe String : método split 2/6 Exemplo de um programa que: Lê ficheiro de texto, chamado notas, contendo nomes e notas de alunos separados por um traço Escreve noutro ficheiro de texto, chamado medias, os nomes dos alunos e as respetivas médias por ordem decrescente e separados por espaços Nelson Freire (ISEP–DEI-APROG 2014/15) 10/18 Ficheiros de Texto Classe String : método split 3/6 import java.io.File; import java.util.*; public class DemoFicheiro { public static void main(String[] args) throws Exception { int n = numAlunos(); float[] medias = new float[n]; String[] nomes = new String[n]; preencherVetores(nomes, medias); ordenarVetores(nomes,medias); escreverFicheiro(nomes,medias); } private static int numAlunos() throws Exception { int n = 0; Scanner fich = new Scanner(new File("notas")); while (fich.hasNextLine()) { n++; fich.nextLine(); } fich.close(); return n; } continua Nelson Freire (ISEP–DEI-APROG 2014/15) 11/18 Classe String : método split Ficheiros de Texto 4/6 private static void ordenarVetores(String[] nomes, float[] med) { for (int i = 0; i < med.length-1; i++) { for (int j = i+1; j < med.length; j++) { if(med[j]>med[i]){ float tmp = med[i]; med[i]= med[j]; med[j]=tmp; String tmp2 = nomes[i]; nomes[i]=nomes[j]; nomes[j]=tmp2; } } } } continua Nelson Freire (ISEP–DEI-APROG 2014/15) 12/18 Classe String : método split Ficheiros de Texto 5/6 private static void preencherVetores( String[] nomes, float[] med ) throws Exception { Scanner fich = new Scanner(new File("notas")); int i=0; while (fich.hasNextLine()) { // lê e guarda a linha seguinte String linha = fin.nextLine(); // decompõe a linha em partes delimitadas por String[] partes = linha.split("-"); nomes[i] = partes[0]; int soma = 0; for (int j = 1; j < partes.length; j++) { soma += Integer.parseInt(partes[j]); } med[i]=(float)soma/(partes.length-1); i++; } fin.close(); } continua Nelson Freire (ISEP–DEI-APROG 2014/15) 13/18 Classe String : método split Ficheiros de Texto 6/6 private static void escreverFicheiro(String[] nomes, float[] med) throws Exception { Formatter fich = new Formatter(new File("medias")); for (int i = 0; i < med.length; i++) { fich.format("%-10s %.1f%n", nomes[i],med[i]); } fich.close(); } } Nelson Freire (ISEP–DEI-APROG 2014/15) 14/18 Escrita em Ficheiro de Texto Ficheiros de Texto 1/4 Procedimento 1. Abrir Ficheiro // recursos do Sistema Operativo alocados para a leitura do ficheiro // Ex: buffers (memória temporária) 2. Escrever no Ficheiro 3. Fechar Ficheiro // libertar recursos alocados Nelson Freire (ISEP–DEI-APROG 2014/15) 15/18 Ficheiros de Texto Escrita em Ficheiro de Texto 2/4 Abrir Ficheiro Classes File // package java.io Formatter // package java.util Objeto Formatter ... para escrever Exemplos import java.io.File; import java.util.Formatter; criado sempre novo ficheiro public class DemoFicheiro { public static void main(String[] args) throws Exception { File f = new File("c:\\nomes.txt"); Formatter fich1 = new Formatter( f ); Alternativa: Formatter fich1 = new Formatter ( new File("c:\\nomes.txt") ); ... Formatter fich2 = new Formatter( new File("c:/equipas.txt") ); Formatter fich3 = new Formatter( new File("c:\\jogos.txt") ); Formatter fich4 = new Formatter( new File("d:\\aprog\\int.txt") ); Formatter fich5 = new Formatter( new File("numeros.txt") ); // ficheiro na pasta do projeto Netbeans ... } } Nelson Freire (ISEP–DEI-APROG 2014/15) 16/18 Ficheiros de Texto Escrita em Ficheiro de Texto 3/4 Escrever no Ficheiro Método format do objeto Formatter objetoFormatter.format(String format, args); Permite escrita formatada Semelhante ao System.out.printf() e String.format() Detalhes nos slides Java - Classes import java.io.File; import java.util.Formatter; public class DemoFicheiro { public static void main(String[] args) throws Exception { // ficheiro na pasta do projeto Netbeans Formatter fich = new Formatter ( new File("numeros.txt") ); // escreve 10 linhas for(int i =1; i<11; i++){ fich.format("%d%n", (int)(Math.random()*10)); } ... } } Nelson Freire (ISEP–DEI-APROG 2014/15) 17/18 Escrita em Ficheiro de Texto Ficheiros de Texto 4/4 Fechar Ficheiro objetoFormatter.close(); Exemplo import java.io.File; import java.util.Formatter; public class DemoFicheiro { public static void main(String[] args) throws Exception { // ficheiro na pasta do projeto Netbeans Formatter fich = new Formatter ( new File("numeros.txt") ); // escreve 10 linhas for(int i =1; i<11; i++){ fich.format("%d%n", (int)(Math.random()*10)); } fich.close(); } } Nelson Freire (ISEP–DEI-APROG 2014/15) 18/18