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