Le classi FileInputStream e RandomAccessFile Semplici

Fondamenti di Informatica
10110
Classe FileInputStream
10110
01100
01100
01011
01011
„
Le classi FileInputStream e
RandomAccessFile
F = new FileInputStream(String pathname);
oppure
fl = new FileInputStream(File f);
Semplici Algoritmi di Ordinamento
„
1
Fondamenti di Informatica - D. Talia - UNICAL
Classe FileInputStream
10110
Nel secondo caso l’argomento f è un oggetto della classe File
dal quale si parte per creare l’oggetto fl sul quale si potranno
eseguire operazioni di lettura tramite i metodi della classe
FileInputStream.
2
Fondamenti di Informatica - D. Talia - UNICAL
Classe FileOutputStream
10110
01100
01100
01011
„
01011
Metodi principali
„ read()
„
legge un byte e restituisce una valore compreso tra 0 e 255.
„
read(byte[] b, off, len)
legge un numero di byte non superiore a len a partire da
off.
„
skip(n)
salta i successivi n byte.
„
close()
chiude il file.
oppure
fs = new FileOutputStream(File f, boolean append);
„
„
Si noti che dopo la chiusura del file non si possono eseguire
operazioni, finché non avviene una nuova creazione.
Fondamenti di Informatica - D. Talia - UNICAL
La classe FileoutputStream definisce oggetti file e metodi
per effettuare operazioni di scrittura su file.
„ Creazione/Apertura
FileOutputStream fs ;
fs = new FileOutputStream(String path, boolean append);
„
FileInputStream : Esempio
01100
01011
„
01011
Metodi principali
„
„
„
write(int b)
scrive i primi 8 bit contenuti nell’intero b.
write(byte[] b, off, len)
scrive un numero di byte uguale a len a partire da off.
skip(n)
salta i successivi n byte.
„
close()
chiude il file.
Fondamenti di Informatica - D. Talia - UNICAL
5
4
Fondamenti di Informatica - D. Talia - UNICAL
10110
01100
Il parametro append indica se occorre scrivere dalla fine del file
(quando vale true) o dall’inizio (quando vale false).
Esempio di creazione con scrittura dalla fine:
f = new FileOutputStream("C:/doc/dati.doc", true);
3
Classe FileOutputStream
10110
La classe FileInputStream definisce oggetti file e
metodi per effettuare operazioni di lettura su file.
„ Creazione/Apertura
FileInputStream fl ;
Il programma legge e visualizza i caratteri
import java.io.*;
presenti in un file e il numero totale di
public class LeggiFile caratteri nel file.
{
static public void main (String argv[])
{
int input; boolean finefile= false; int cont = 0;
FileInputStream f= new FileInputStream("dati.txt");
while(!finefile) // finchè non si è raggiunta la fine
{
// del file
input = f.read();
if (input == -1)
// si è alla fine del file
finefile = true;
else
{ System.out.print((char)input + " ");
cont++;}
// incrementa il contatore
}
// dei caratteri letti
f.close();
System.out.println("Caratteri letti. " + cont);
} // chiude il main
} // chiude la classe
Fondamenti di Informatica - D. Talia - UNICAL
6
1
Classe RandomAccessFile
10110
01011
„
Classe RandomAccessFile
10110
01100
01100
La classe RandomAccessFile comprende i metodi per la
lettura e la scrittura di un file. Questa classe è la più
completa per memorizzare dati su memoria secondaria.
„
01011
„
„
„
Creazione/Apertura
RandomAccessFile f;
f= new RandomAccessFile(String path, String
modo); il modo può essere "r" o "rw"
f= new RandomAccessFile(File file, String modo);
Esempio di apertura in lettura e scrittura:
f = new RandomAccessFile(“risultati.txt, “rw”);
7
Fondamenti di Informatica - D. Talia - UNICAL
Classe RandomAccessFile
10110
scrive un byte corrispondente ai primi 8 bit di b.
write(byte[] b, off, len)
scrive un numero di byte di b uguale a len a partire da off.
„
writeInt(int v) scrive quattro byte corrispondenti a v.
„
writeChar(int v)
„
writeLong(long v) scrive otto byte corrispondenti a v.
„
writeFloat(float v)
„
writeChars(String s) scrive i caratteri della stringa s.
scrive due byte corrispondenti a (char) v.
scrive quattro byte corrispondenti a v.
8
Ordinamento di una sequenza di elementi
01100
01011
„
01011
Metodi principali
„
Esistono molti algoritmi di ordinamento. Tutti ricevono in
input una sequenza non ordinata di elementi e restituiscono la
sequenza ordinata.
„
int readInt()
legge un intero.
„
char readChar()
legge un carattere.
„
long readLong()
legge un long.
„
float readFloat()
legge un reale.
„
String readLine()
„
legge una stringa di caratteri fino al carattere di fine riga '\n'.
„
„
length()
restituisce il numero di byte del file.
„
seek(pos)
imposta il file pointer alla posizione pos.
„
close()
chiude il file.
„
Algoritmi di ordinamento:
„
„
„
„
9
Fondamenti di Informatica - D. Talia - UNICAL
Selection sort
selection sort,
quick sort,
bubble sort,
merge sort.
Ognuno di questi algoritmi usa un metodo diverso per ordinare
una sequenza di elementi.
Tutti generano lo stesso risultato (sequenza ordinata), ma alcuni
sono più efficienti di altri.
10
Fondamenti di Informatica - D. Talia - UNICAL
Selection sort
10110
01100
01011
write(int b)
Fondamenti di Informatica - D. Talia - UNICAL
10110
01100
10110
Metodi principali
01100
01011
Ordinamento per selezione (selection sort)
„
„
Questo algoritmo ordina una sequenza di elementi
œ andando a trovare l’elemento minore e portandolo nella posizione
iniziale della sequenza, e l’elemento in posizione iniziale nella
posizione occupata del valore minore.
85 | 37 | -3 | 10 | 9
L’algoritmo opera su una sequenza non ordinata come se fosse
composta di due sotto-sequenze:
„ la prima ordinata e la seconda non-ordinata,
„ andando a cercare il valore minimo nella sequenza nonordinata e portandolo nella ultima posizione della sequenza
ordinata.
-3 | 37 | 85 | 10 | 9
 Quindi sulla sotto-sequenza non ordinata effettua la stessa
operazione fino a che rimane un solo elemento (che è ordinato).
-3 | 37 | 85| 10 | 9
-3 | 9 | 85 | 10 | 37
„
-3 | 9 | 85| 10 | 37
-3 | 9 | 10 | 85 | 37
-3 | 9 | 10| 85 | 37
-3 | 9 | 10 | 37 |85
Quando la sotto-sequenza non ordinata è composta da un
solo elemento l’ordinamento è terminato (l’ultimo elemento è il
maggiore).
Fondamenti di Informatica - D. Talia - UNICAL
11
Fondamenti di Informatica - D. Talia - UNICAL
12
2
Selection Sort in Java
10110
01100
01011
01011
public void ordinaSel(int[] vet)
{
for (int j = 0; j < vet.length-1; j++)
{
int temp;
int pos_min = j;
for (int i = j+1; i < vet.length; i++)
if (vet[pos_min] > vet[i])
pos_min = i;
if (pos_min != j)
{
temp = vet[j];
vet[j] = vet[pos_min];
vet[pos_min] = temp;
}
}
// chiude il for
}
„
„
„
„
13
Fondamenti di Informatica - D. Talia - UNICAL
Bubble sort
10110
Si usano due indici i e j: j scorre su tutto l’array, mentre i
scorre sulla parte dell’array non ordinata.
All’inizio si assume che la posizione dell’elemento minore è
0 e dalla posizione 1 fino alla fine si cerca il valore minimo. Se
questo è più piccolo dell’elemento nella posizione 0 viene
scambiato.
Quindi si incrementa l’indice j (che identifica la prima posizione
della parte non ordinata) e si esegue nuovamente la ricerca del
minimo nella sotto-sequenza rimanente.
Alla fine l’elemento che rimarrà nell’ultima posizione dell’array
(v[v.length-1]) è il valore maggiore.
14
Fondamenti di Informatica - D. Talia - UNICAL
Bubble sort
10110
01100
01011
Selection Sort in Java
10110
01100
01100
01011
Ordinamento per scambio (bubble sort)
„
„
Questo algoritmo ordina una sequenza di elementi
œ andando a confrontare gli elementi a coppie e scambiandoli di
posto se il secondo è minore del primo.
Dopo la prima scanzione abbiamo effettuato 4 scambi ma non
abbiamo ottenuto la sequenza ordinata. Quindi si riparte
dall’inizio a scambiare gli elementi:
37 | -3 | 10 | 9| 85
-3 | 37 | 10| 9 | 85
2a scansione
85 | 37 | -3 | 10 | 9
37 | 85 | -3 | 10 | 9
37 | -3 | 85| 10 | 9
37 | -3 | 10 | 85 | 9
-3 | 10 | 37 | 9 | 85
1a scansione
3a scansione
 L’algoritmo termina quando dopo aver scandito tutta la sequenza
senza che non sia stato effettuato alcuno scambio. In questo caso
la sequenza risulta già ordinata.
Fondamenti di Informatica - D. Talia - UNICAL
15
Bubble Sort in Java
10110
-3 | 9 | 10 |37 | 85
Se dopo una scansione (in questo caso la 4a scanzione) non
sono stati effettuati scambi, gli elementi sono già ordinati e
l’ordinamento è completato.
Fondamenti di Informatica - D. Talia - UNICAL
16
Bubble Sort e Selection Sort in Java
10110
01100
01011
„
-3 |10 | 9 |37 | 85
01100
01011
public void ordinaBub(int[] v)
{ boolean scambio ; int j= v.length-1;
do
{
scambio = false;
for (int i=0; i < j ; i++)
{
int temp;
if (v[i] > v[i+1])
{
temp = v[i];
v[i] = v[i+1];
v[i+1] = temp;
scambio = true;
}
}
// chiude il for
j = j-1;
}
while (scambio == true);
}
Fondamenti di Informatica - D. Talia - UNICAL
„
„
„
Gli algoritmi di ordinamento selection sort e bubble sort sono
algoritmi abbastanza semplici, ma non sono i più efficienti.
Il quick sort ed il merge sort sono più complessi ma più efficienti
perché effettuano un numero minore di scansioni degli elementi
di una sequenza.
Altri algoritmi di ordinamento :
„
„
„
„
17
insertion sort
heap sort
shaker Sort
....
Fondamenti di Informatica - D. Talia - UNICAL
18
3