ficheiros de texto - departamento de engenharia informáticanfreire/ficheiros de texto -...

18
Nelson Freire (ISEP–DEI-APROG 2014/15) 1/18 Ficheiros de Texto Java Algoritmia e Programação APROG

Upload: others

Post on 23-Sep-2019

5 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Ficheiros de Texto - Departamento de Engenharia Informáticanfreire/FICHEIROS de TEXTO - Java.pdf · Lê ficheiro de texto, chamado notas, contendo nomes e notas de alunos separados

Nelson Freire (ISEP–DEI-APROG 2014/15) 1/18

Ficheiros de Texto Java

Algoritmia e Programação APROG

Page 2: Ficheiros de Texto - Departamento de Engenharia Informáticanfreire/FICHEIROS de TEXTO - Java.pdf · Lê ficheiro de texto, chamado notas, contendo nomes e notas de alunos separados

Nelson Freire (ISEP–DEI-APROG 2014/15) 2/18

Estrutura de Dados

Armazena

Sequência de Dados

Comprimento arbitrário

Dados de tipos diferentes

Modo Permanente // em memória secundária

Noção de Ficheiro Ficheiros de Texto

Memória Secundária (Disco Interno)

Memória Secundária (PenDrive, Disco Externo, CD, DVD)

Processador (CPU)

Memória Principal (RAM)

Dado 1 Dado 2 ... Dado N

Page 3: Ficheiros de Texto - Departamento de Engenharia Informáticanfreire/FICHEIROS de TEXTO - Java.pdf · Lê ficheiro de texto, chamado notas, contendo nomes e notas de alunos separados

Nelson Freire (ISEP–DEI-APROG 2014/15) 3/18

Tipos de Ficheiros

Tipos de Ficheiros

Ficheiro Texto

Programa

Ficheiro Binário

Tipos de

Ficheiros Sequência

Formato dos

Dados

Processadores de

Texto Interesse

Texto Carateres

(Codificação baseada em tabelas de carateres, por exemplo: ASCII, Unicode (UTF-8, ...), etc.)

Texto Legível Guardar Dados

Públicos

Binário Códigos Binários Binário Ilegível Guardar Dados

Privados

APROG aborda apenas os ficheiros de texto

Ficheiros de Texto

Page 4: Ficheiros de Texto - Departamento de Engenharia Informáticanfreire/FICHEIROS de TEXTO - Java.pdf · Lê ficheiro de texto, chamado notas, contendo nomes e notas de alunos separados

Nelson Freire (ISEP–DEI-APROG 2014/15) 4/18

Tipos

Leitura

Escrita

Operações sobre Ficheiros Ficheiros de Texto

Page 5: Ficheiros de Texto - Departamento de Engenharia Informáticanfreire/FICHEIROS de TEXTO - Java.pdf · Lê ficheiro de texto, chamado notas, contendo nomes e notas de alunos separados

Nelson Freire (ISEP–DEI-APROG 2014/15) 5/18

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

Leitura de Ficheiro de Texto 1/4 Ficheiros de Texto

Page 6: Ficheiros de Texto - Departamento de Engenharia Informáticanfreire/FICHEIROS de TEXTO - Java.pdf · Lê ficheiro de texto, chamado notas, contendo nomes e notas de alunos separados

Nelson Freire (ISEP–DEI-APROG 2014/15) 6/18

Abrir Ficheiro

Classes File // package java.io Scanner // 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 ); ...

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

... } }

Alternativa: Scanner fich1 = new Scanner( new File("c:\\nomes.txt") );

Leitura de Ficheiro de Texto 2/4 Ficheiros de Texto

Page 7: Ficheiros de Texto - Departamento de Engenharia Informáticanfreire/FICHEIROS de TEXTO - Java.pdf · Lê ficheiro de texto, chamado notas, contendo nomes e notas de alunos separados

Nelson Freire (ISEP–DEI-APROG 2014/15) 7/18

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() ); } ... } }

Leitura de Ficheiro de Texto 3/4 Ficheiros de Texto

Page 8: Ficheiros de Texto - Departamento de Engenharia Informáticanfreire/FICHEIROS de TEXTO - Java.pdf · Lê ficheiro de texto, chamado notas, contendo nomes e notas de alunos separados

Nelson Freire (ISEP–DEI-APROG 2014/15) 8/18

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(); } }

Leitura de Ficheiro de Texto 4/4 Ficheiros de Texto

Page 9: Ficheiros de Texto - Departamento de Engenharia Informáticanfreire/FICHEIROS de TEXTO - Java.pdf · Lê ficheiro de texto, chamado notas, contendo nomes e notas de alunos separados

Nelson Freire (ISEP–DEI-APROG 2014/15) 9/18

Interesse

Decompor uma string em partes separadas por delimitadores: iguais ou diferentes

Exemplo: Delimitadores Iguais

String registo = "joão/1961/10/1";

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

Exemplo: Delimitadores Diferentes

Delimitador

"joão" "1961" "10" "1" campos

0 1 2 3

Classe String : método split 1/6

String s = "5-6+7-8";

String[] c = s.split("[+-]");

// c[0]="5", c[1]="6", c[2]="7", c[3]="8"

Ficheiros de Texto

Page 10: Ficheiros de Texto - Departamento de Engenharia Informáticanfreire/FICHEIROS de TEXTO - Java.pdf · Lê ficheiro de texto, chamado notas, contendo nomes e notas de alunos separados

Nelson Freire (ISEP–DEI-APROG 2014/15) 10/18

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

Classe String : método split 2/6 Ficheiros de Texto

Page 11: Ficheiros de Texto - Departamento de Engenharia Informáticanfreire/FICHEIROS de TEXTO - Java.pdf · Lê ficheiro de texto, chamado notas, contendo nomes e notas de alunos separados

Nelson Freire (ISEP–DEI-APROG 2014/15) 11/18

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

Ficheiros de Texto

Page 12: Ficheiros de Texto - Departamento de Engenharia Informáticanfreire/FICHEIROS de TEXTO - Java.pdf · Lê ficheiro de texto, chamado notas, contendo nomes e notas de alunos separados

Nelson Freire (ISEP–DEI-APROG 2014/15) 12/18

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;

}

}

}

}

Classe String : método split 4/6

continua

Ficheiros de Texto

Page 13: Ficheiros de Texto - Departamento de Engenharia Informáticanfreire/FICHEIROS de TEXTO - Java.pdf · Lê ficheiro de texto, chamado notas, contendo nomes e notas de alunos separados

Nelson Freire (ISEP–DEI-APROG 2014/15) 13/18

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();

}

Classe String : método split 5/6

continua

Ficheiros de Texto

Page 14: Ficheiros de Texto - Departamento de Engenharia Informáticanfreire/FICHEIROS de TEXTO - Java.pdf · Lê ficheiro de texto, chamado notas, contendo nomes e notas de alunos separados

Nelson Freire (ISEP–DEI-APROG 2014/15) 14/18

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();

}

}

Classe String : método split 6/6 Ficheiros de Texto

Page 15: Ficheiros de Texto - Departamento de Engenharia Informáticanfreire/FICHEIROS de TEXTO - Java.pdf · Lê ficheiro de texto, chamado notas, contendo nomes e notas de alunos separados

Nelson Freire (ISEP–DEI-APROG 2014/15) 15/18

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

Escrita em Ficheiro de Texto 1/4 Ficheiros de Texto

Page 16: Ficheiros de Texto - Departamento de Engenharia Informáticanfreire/FICHEIROS de TEXTO - Java.pdf · Lê ficheiro de texto, chamado notas, contendo nomes e notas de alunos separados

Nelson Freire (ISEP–DEI-APROG 2014/15) 16/18

Abrir Ficheiro

Classes File // package java.io Formatter // package java.util

Objeto Formatter ... para escrever

Exemplos

Escrita em Ficheiro de Texto 2/4

import java.io.File;

import java.util.Formatter;

public class DemoFicheiro {

public static void main(String[] args) throws Exception {

File f = new File("c:\\nomes.txt");

Formatter fich1 = new Formatter( f ); ...

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

... } }

Alternativa: Formatter fich1 = new Formatter ( new File("c:\\nomes.txt") );

criado sempre novo ficheiro

Ficheiros de Texto

Page 17: Ficheiros de Texto - Departamento de Engenharia Informáticanfreire/FICHEIROS de TEXTO - Java.pdf · Lê ficheiro de texto, chamado notas, contendo nomes e notas de alunos separados

Nelson Freire (ISEP–DEI-APROG 2014/15) 17/18

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

Escrita em Ficheiro de Texto 3/4

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));

}

... } }

Ficheiros de Texto

Page 18: Ficheiros de Texto - Departamento de Engenharia Informáticanfreire/FICHEIROS de TEXTO - Java.pdf · Lê ficheiro de texto, chamado notas, contendo nomes e notas de alunos separados

Nelson Freire (ISEP–DEI-APROG 2014/15) 18/18

Fechar Ficheiro

objetoFormatter.close();

Exemplo

Escrita em Ficheiro de Texto 4/4

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(); } }

Ficheiros de Texto