Ficheiros de Texto - Dei-Isep

Propaganda
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
Download